精华内容
下载资源
问答
  • 网上 这篇文章 简明扼要地整理出最常见os方法,抄袭如下:os.listdir(dirname):列出dirname下的目录和文件os.getcwd():获得当前工作目录os.curdir:返回当前目录('.')os.chdir(dirname):改变工作目录到dir...

    因为工作原因,需要定期清理某个文件夹下面创建时间超过1年的所有文件,所以今天集中学习了一下Python对于本地文件及文件夹的操作。网上 这篇文章 简明扼要地整理出最常见的os方法,抄袭如下:

    os.listdir(dirname):列出dirname下的目录和文件

    os.getcwd():获得当前工作目录

    os.curdir:返回当前目录('.')

    os.chdir(dirname):改变工作目录到dirname

    os.path.isdir(name):判断name是不是一个目录,name不是目录就返回false

    os.path.isfile(name):判断name是不是一个文件,不存在name也返回false

    os.path.exists(name):判断是否存在文件或目录name

    os.path.getsize(name):获得文件大小,如果name是目录返回0L

    os.path.abspath(name):获得绝对路径

    os.path.normpath(path):规范path字符串形式

    os.path.split(name):分割文件名与目录(事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在)

    os.path.splitext():分离文件名与扩展名

    os.path.join(path,name):连接目录与文件名或目录

    os.path.basename(path):返回文件名

    os.path.dirname(path):返回文件路径

    os.remove(dir) #dir为要删除的文件夹或者文件路径

    os.rmdir(path) #path要删除的目录的路径。需要说明的是,使用os.rmdir删除的目录必须为空目录,否则函数出错。

    os.path.getmtime(name) #获取文件的修改时间

    os.stat(path).st_mtime#获取文件的修改时间

    os.stat(path).st_ctime #获取文件修改时间

    os.path.getctime(name)#获取文件的创建时间

    于是我照着这些方法,费半天劲,终于写出了“清理某路径下所有文件及文件夹”的方法,代码如下:

    import os

    dirToBeEmptied = 'D:\_Data\Python\os' #需要清空的文件夹

    ds = list(os.walk(dirToBeEmptied)) #获得所有文件夹的信息列表

    dsr = ds[::-1] #反转该列表,从最底层的文件夹开始清算

    for d in dsr: #遍历该列表

    print(d) #打印出列表项,观察规律

    if d[2] != []: #如果该路径下有文件

    for x in d[2]: #先将文件清理干净

    os.remove(os.path.join(d[0], x))

    for d in dsr: #再次遍历该列表

    if d[1] != []: #如果该路径下有子文件夹

    for y in d[1]: #将子文件夹清理干净

    os.rmdir(os.path.join(d[0], y))

    之所以这么麻烦,是因为 os.rmdir() 有个毛病,只能删除“空”文件夹。所以只能从最底层的文件夹开始清理,一级一级往上,才能清干净。

    后来想想,应该有更简便的方法,因为清空文件夹是很常见的动作。查了Python官方文档,发现了os以外的另一个模块:shutil(高级文件操作),竟然有 shutil.rmtree() 的方法,不仅是清空,直接连文件夹都一起删掉,太凶残了!

    为了“仅仅清空”,我搭配使用 shutil 模块重写了代码:

    import shutil, os

    os.chdir('d:\_data\python\os') #进入要清空的目录

    ds = list(os.listdir()) #获得该目录下所有文件或文件夹列表

    for d in ds: #遍历该列表

    if os.path.isfile(d): #如果列表项是文件

    os.remove(d) #直接删除

    else: #如果不是文件,肯定是文件夹

    shutil.rmtree(d) #也直接删除

    这下可就简洁多了。

    不过,清空一时爽,但已经偏离我原来的目的了:我只是想删除过期的文件,但文件夹和所有子文件夹都得留着啊。倒也不难,最开始的代码中,第1次遍历列表就是只删文件、不删文件夹。只要再加个判断语句,判断出文件是否过期,就能达到目的了。

    我要删除的文件,实际上是做镜像备份时,将已从主机删除或更改的文件暂时保存下来,以备恢复之用。这些文件久了会越来越占空间,因此设定为1年过期。这些文件有一个特点,就是只会被复制过来一次,且不会有任何修改,因此只需要判断其创建日期就可以。

    想着是容易,但万万没想到,Python对时间的处理这么复杂!涉及到两个模块:datetime 和 time。有时间必须重头系统学习一下,但这里,我只关心现在需要的几个方法:

    datetime.datetime.now() #获取当前时间,返回值的格式类似 datetime.datetime(2017, 12, 14, 1, 29, 24, 406538)

    datetime.timedelta() #设定两个时间之间的间隔,用于时间计算,可以设置的单位包括:(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0),默认都为0

    os.path.getctime() #获取文件的创建时间,返回值的格式为一个巨大的浮点数,为1970年1月1日到这个创建时间所历经的秒数

    datetime.datetime.fromtimestamp() #将os.path.getctime() 转换为跟datetime.datetime.now()一样的格式,以进行比较计算

    弄清楚上面这些乱七八糟的之后,就可以写代码了:

    import os, datetime

    dirToBeEmptied = 'D:\_Data\Python\os' #需要清空的文件夹

    ds = list(os.walk(dirToBeEmptied)) #获得所有文件夹的信息列表

    delta = datetime.timedelta(days=365) #设定365天前的文件为过期

    now = datetime.datetime.now() #获取当前时间

    for d in ds: #遍历该列表

    os.chdir(d[0]) #进入本级路径,防止找不到文件而报错

    if d[2] != []: #如果该路径下有文件

    for x in d[2]: #遍历这些文件

    ctime = datetime.datetime.fromtimestamp(os.path.getctime(x)) #获取文件创建时间

    if ctime < (now-delta): #若创建于delta天前

    os.remove(x) #则删掉

    呼~~~~~~~~~

    真够复杂的!不知道有没有简便一点的办法……

    以上这篇用Python删除本地目录下某一时间点之前创建的所有文件的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    展开全文
  • shell脚本实现定时任务,每天凌晨06点删除 某一目录下日期为一天的目录和子文件
  • 网上 这篇文章 简明扼要地整理出最常见os方法,抄袭如下:于是我照着这些方法,费半天劲,终于写出了“清理某路径下所有文件及文件夹”方法,代码如下:之所以这么麻烦,是因为 os.rmdir() 有个毛病,只能删除...

    因为工作原因,需要定期清理某个文件夹下面创建时间超过1年的所有文件,所以今天集中学习了一下Python对于本地文件及文件夹的操作。网上 这篇文章 简明扼要地整理出最常见的os方法,抄袭如下:

    于是我照着这些方法,费半天劲,终于写出了“清理某路径下所有文件及文件夹”的方法,代码如下:

    之所以这么麻烦,是因为 os.rmdir() 有个毛病,只能删除“空”文件夹。所以只能从最底层的文件夹开始清理,一级一级往上,才能清干净。

    后来想想,应该有更简便的方法,因为清空文件夹是很常见的动作。查了Python官方文档,发现了os以外的另一个模块:shutil(高级文件操作),竟然有 shutil.rmtree() 的方法,不仅是清空,直接连文件夹都一起删掉,太凶残了!

    为了“仅仅清空”,我搭配使用 shutil 模块重写了代码:

    这下可就简洁多了。

    不过,清空一时爽,但已经偏离我原来的目的了:我只是想删除过期的文件,但文件夹和所有子文件夹都得留着啊。倒也不难,最开始的代码中,第1次遍历列表就是只删文件、不删文件夹。只要再加个判断语句,判断出文件是否过期,就能达到目的了。

    我要删除的文件,实际上是做镜像备份时,将已从主机删除或更改的文件暂时保存下来,以备恢复之用。这些文件久了会越来越占空间,因此设定为1年过期。这些文件有一个特点,就是只会被复制过来一次,且不会有任何修改,因此只需要判断其创建日期就可以。

    想着是容易,但万万没想到,Python对时间的处理这么复杂!涉及到两个模块:datetime 和 time。有时间必须重头系统学习一下,但这里,我只关心现在需要的几个方法:

    datetime.datetime.now() #获取当前时间,返回值的格式类似 datetime.datetime(2017, 12, 14, 1, 29, 24, 406538)

    datetime.timedelta() #设定两个时间之间的间隔,用于时间计算,可以设置的单位包括:(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0),默认都为0

    os.path.getctime() #获取文件的创建时间,返回值的格式为一个巨大的浮点数,为1970年1月1日到这个创建时间所历经的秒数

    datetime.datetime.fromtimestamp() #将os.path.getctime() 转换为跟datetime.datetime.now()一样的格式,以进行比较计算

    弄清楚上面这些乱七八糟的之后,就可以写代码了:

    呼~~~~~~~~~

    真够复杂的!不知道有没有简便一点的办法……

    以上这篇用Python删除本地目录下某一时间点之前创建的所有文件的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

    原文链接:http://www.cnblogs.com/iderek/p/8035757.html

    展开全文
  • 文章目录前言HDFS目录删除行为HDFS大目录删除实现方案思考...不敢说是谈论是HDFS大目录删除的最佳实践方案,但是在某些上,在实际环境中还是有一定可应用性。本文部分内容会引入笔者段时间写两篇...

    前言


    前面几篇文章笔者讲述了2篇关于文件目录删除的相关文章,也提到了一些相对应的解决方案和思路。不过笔者本文想再谈谈对于这个问题的一些思考,主要关注在HDFS下大目录的删除性能影响方面。不敢说是谈论的是HDFS大目录删除的最佳实践方案,但是在某些点上,在实际环境中还是有一定的可应用性的。本文部分内容会引入笔者前段时间写的两篇相关文章:聊聊HDFS删除Snapshot行为导致的NameNode crash文件系统大目录下的操作性能效率提升

    HDFS的大目录删除行为


    曾经执行过HDFS大目录rm行为的同学,应该能切身体会到这个操作给集群带来的重大影响,尤其当这个大目录拥有数量庞大的子文件数以及足够深的深度目录树。

    因为这个删除操作本身是要池NN FSN锁的,所以这个过程执行的越漫长,对其它正常的RPC请求的处理影响就越大。

    那么为什么大目录删除会有这么大的影响呢,总结下来有以下相关三点:

    • 单目录下子entry过多(子目录或子文件),造成delete动作的性能开销。因HDFS目录内用ArrayList做目录孩子文件的信息保存的。当子文件过多的时候,就触发了ArrayList remove操作的性能影响。这点笔者在文件系统大目录下的操作性能效率提升中有相关详细细节的讨论。
    • 目录深度过深且目录下文件总数量规模庞大,需要进行逐一层级的递归目录树的遍历。在这点上,在后面小节中我们再来讨论这个问题。
    • HDFS快照加剧了目录删除的影响。这里的前提是如果集群启用了HDFS Snapshot的情况下,因为Snapshot会保留在Snapshot创建时间点后被删除的那些文件目录数据,达到数据保护的效果。那么这么被“延时”删除的数据会在Snapshot被清理的那一刻, 进行一次性的删除处理。这就好比是一个更大目录删除的叠加效果。

    HDFS大目录删除实现方案思考


    针对上节提到的三个难题,每一个说实话都不好解决,社区有一些解决方案和思路但是并没有被合入release的分支里面。

    第一个问题,单一目录子文件过多触发ArrayList性能问题这点,社区HDFS-7174 JIRA有解决方案,原理是通过拆ArrayList的方式达到优化的效果,笔者也测试了这个JIRA的patch,效果还是相当的明显的,详见文章文件系统大目录下的操作性能效率提升

    第二个难点问题,目录树深且待删除目录总文件数庞大。

    这里其实有个变相的做法可以绕开这个问题,如果我们不想在HDFS内部删除逻辑这块做优化的情况下,通过改变外部的删除调用时间会是十分简单高效的做法。简单来说,就是让用户不要一下子删除那么目录文件走。取而代之的方式是分小时,分时段一批批的去删除目标的文件目录。因为HDFS Trash机制在后面清理trash目录的时候就会按照时间小时目录依次去清理删除目录,每个小时目录其实删除的量就会小很多,对NN造成的影响也就会小。当然,此方案在HDFS Snapshot目录的case下是起不到作用的。

    至于这个难点的另外一个目录树深的问题,这里可以brainstorm一下,比如用线程递归的方式去扫描目录文件数据。这里还不能是纯线程异步的方式,因为这里会涉及到HDFS quota的更新问题,可能可行的方案是多线程启动递归执行,然后在删除目录的call方法里等待线程执行结束。不过社区在这块操作上只是做了removeINode和removeBlock动作的拆分,仅到此为止。removeBlock这步完全是可以分批进行的,所以社区在这里是通过batch的方式分批进行删除。通过改小这个删除block的batch size是可以减轻一些删除操作锁带来的影响的,相关JIRA:HDFS-13831: Make block increment deletion number configurable

    第三个难点,HDFS Snapshot模式下怎么减轻删除目录的影响。HDFS Snapshot会hold住实际已经删除了的文件目录数据。如果我们调整自己的删除目录操作时间,也是不起作用的。那么这个时候有什么好的办法呢?答案很简单,同样更改Snapshot的创建时间点,我们将每次的一个大Snapshot变为若干小的Snapshot。这样的话,其实每个小Snapshot所删除的文件目录树就会小很多。

    通过建更多小Snapshot的方式,笔者在内部集群上也进行测试过,优化效果只能说一般般。HDFS小Snapshot确实删除的量会变小,但是其中有个getChilrenList的方式有比较大的时间cost。这个getChilrenList的调用主要是通过获取Snapshot的diff来得到那个Snapshot时间点的文件列表数据,然后进行目录的递归删除。

    但是getChilrenList在快照很多的情况下需要进行多次Snapshot diff的合并动作,然后再逆序apply到当前的文件目录状态,以此获得Snapshot时间点的状态。

    以下面的例子为例,

    Diffs: s0­>s1­>s2­>s3­>s4­>s5­>s6­>s7­>s8­>s9­

    上面总共10个Snapshot按照时间顺序依次创建而来。假设我们此时准备删除创建实际最早的s0开始,然后我们需要去获取s0时刻Snapshot目录的子文件目录的列表情况,它需要将s0相对s1的diff,比如叫diff01,和后面依次diff12…diff89,和最后的diff9-latest状态的这些diff进行合并。这个过程是会占据一定时间的。

    不过社区有解决方案解决上述getChilrenList的操作性能问题,通过SkipList维护多level的Snapshot diff list来达到加速ChilrenList获取的速度。此方案的主要drawback是需要用额外的内存来保存这些diff数据。这里需要我们在具体使用的时候做一定的衡量,此方案相关的JIRA: HDFS-11225: NameNode crashed because deleteSnapshot held FSNamesystem lock too long

    SkipList的结构类似如下:

    • level 2: s08------------------------------->s9
    • level 1: S02------->s35-------->s68-------->s9
    • level 0: s0->s1->s2->s3->s4->s5->s6->s7->s8->s9

    在上面s0-s9的Snapshot模式下,如果从中间Snapshot开始删,会达到优化的效果吗?实际来说的话,优化效果也比较一般,假设我们从s3删除开始,所说它所需要做diff combine的次数少了,但是它的diff diff34还是需要和diff23进行一次merge作为s2的diff的。其实我们可以看到它的combine diff的总开销其实并没有减少多少。

    以上就是本文笔者关于HDFS大目录删除方案的一些想法思考方案,大家感兴趣的可以参考实践实践。

    引用


    [1].https://issues.apache.org/jira/browse/HDFS-11225
    [2].https://issues.apache.org/jira/browse/HDFS-13831
    [3].https://blog.csdn.net/Androidlushangderen/article/details/105454638
    [4].https://blog.csdn.net/Androidlushangderen/article/details/105256532

    展开全文
  • php 递归删除目录

    2016-07-04 00:49:06
    php递归删除目录需要注意是原本就自动带有“.”和“..”,还有就是如果目录中有文件,就不能直接删除 明白这,我们就开始删吧:(删确保./a目录存在哈) /** 递归删除目录 **/ function deldir($path) { ...

    php递归删除目录需要注意的是原本就自动带有的“.”和“..”,还有就是如果目录中有文件,就不能直接删除

    明白这点,我们就开始删吧:(删前确保./a目录存在哈)

    /**
    递归删除目录
    **/
    
    function deldir($path) {
    
        // 不是目录,直接返回
        if(!is_dir($path)) {
            return NULL;
        }
        
        // 走到这步说明是目录
        $dh = opendir($path);
        while(($row = readdir($dh)) !== false) {
            //过滤.和..
            if($row == '.' || $row == '..') {
                continue;
            }
    
            // 判断是否是普通文件
            if(!is_dir($path . '/' . $row)) {
                unlink($path . '/' . $row);
            } else {
                deldir($path . '/' . $row); //递归把子目录/子文件删了
            }
        }
    
        closedir($dh);
        rmdir($path);
    
        echo '删了',$path,'<br />';
        return true;
    
    }
    
    echo deldir('./a')?'ok':'false';


    展开全文
  • find查找删除文件例如从当前目录查找所有以.txt结尾文件并在屏幕上显示出来,命令行为:find 。 -name ‘*.txt’ -print查找两个后缀文件,就改为下面用法:find 。 ( -name *.xml -o -n...
  • 1.去掉目录前面黑点 最近我也是临近毕业,在写毕业论文...2.删除目录空白页 我们选择开始菜单下显示或隐藏编辑标记按钮,就会出现分节符。 然后我们选择这个分节符,按delete键,即可删除空白页了!!! ...
  • 在清空文件夹时,调用了RemoveDirectory,在调用已经删除了文件夹中所有文件,但就是不能成功调用。分析来分析去,其实原因很简单,但也很具有欺骗性。 其实是在调用FindFirstFile和FindNextFile这套函数组合后,...
  • 通过find命令 find /xx -mtime +30 -name “.log" -exec rm -rf {} ; 想要定期删除可以写个crontab 例如 00 02 * * * /bin/find /xx -mtime +30 -name ".log” -exec ...#每天的凌晨2点删除xx目录下的30天前的日志 ...
  • 该shell为删除指定目录下,30天前的文件 #!/bin/sh location="/root/sqlbak/" find $location -mtime +30 -type f |xargs rm -f 例: 定时任务——crontab -e 设定为每个月1号晚上410分执行脚本.当然你也可以根据...
  • Linux操作文件常用命令,复制、删除、移动文件或目录   cp:复制文件或目录 1.cp 源文件名 目标文件 2.cp -i 源文件名 目标文件 -i 目标文件已经存在,在覆盖会询问是否覆盖 y 覆盖 n 不覆盖 3.cp ...
  • python 删除前3天文件 一、需求分析 1. 删除前3天文件 2.如果目录为空,也一并删除掉 如果使用shell脚本,一条命令就搞定了。干啥还要用python? 1. 因为需要记录一些日志,使用shell不好...
  • 文接上篇,为大家介绍word页眉页脚制作经验。页眉、页码我相信大家只要接触过word文档那大家基都有做过。...2.第四页为目录页面,目录制作教程点击下面链接(一)关于word文档格式设置中的目录、页眉...
  • linux 删除N天前的文件

    2015-03-25 10:46:35
    表示每天早上六点删除/root/home/zhang目录下一天创建所有文件,不删除文件夹zhang,如果这个文件夹也要删除的话用 * 6 * * * find /root/home/zhang ctime 1 -exec rm -rf {} \; * 6 * *
  • 表示每天早上六点删除/root/home/zhang目录下一天创建所有文件,不删除文件夹zhang,如果这个文件夹也要删除的话用* 6 * * * find /root/home/zhang ctime 1 -exec rm-rf {} \; * 6 * * * 第一个*
  • 表示每天早上六点删除/root/home/zhang目录下一天创建所有文件,不删除文件夹zhang,如果这个文件夹也要删除的话用 * 6 * * * find /root/home/zhang ctime 1 -exec rm -rf {} \; * 6 * *
  • 表示每天早上六点删除/root/home/zhang目录下一天创建所有文件,不删除文件夹zhang,如果这个文件夹也要删除的话用 * 6 * * * find /root/home/zhang ctime 1 -exec rm -rf {} \; * 6 * *
  • shell相关命令1.echo 0$2.bash --version3.cat /etc/shells文件类型drwxr-xr-x 四位d表示目录文件,rwx表示是文件所有者所有权限,5.6.7位表示属组权限,8.9.10位表示其他用户权限r(读权限)=4 w(写权限)...
  • 通过执行DOS命令窗口可以完成文件**新建**、**保存**、**删除**等一系列快捷操作 3. 创建文件夹 mkdir + 所创建文件夹文件名 mkdir = *make directory* 4. 默认DOS命令窗口所在地址 打开基本目录是在 C:\...
  • 五天知识总结

    2015-08-03 23:33:28
    rd:删除目录; cd:进入指定目录; cd.. :退回到上一级目录; cd\:退回到根目录; del:删除文件; exit:退出dos命令行; 2、java语言概述  (1)Java语言发展史  Java之父 -- 詹姆斯·高斯林(James ...
  • 删除Book添加下面开始写dao、service、servlet层易错,跳转添加功能 小结与思考 —— 小白实际上手遇到问题(上面都有答案)删除二、修改Book(未整合修改和添加功能)总结 前言 接上一篇 一、添加Book&...
  • 它使用相当方便,由界面上助手指引,宽带连接慢怎么办 可以将误删除或格式化后分区及硬盘恢复到误操作之前状态,文件和目录信息也同样恢复。通过使用特别开发算法,O&O FormatRecovery可以搜索整个被格式化...
  • 不久才因为自己一个手快执行了 “rm /“,误删除了整个根目录。数据丢失教训有时候是巨大而难以承受。* 2.1 一条危险命令 rm -rf 2.1 一条危险命令 rm -rf...
  • * 5 * * * find /tmp/* -name "yhwl_task.log*" -ctime +3 -exec rm -rf {} \;* 5 * * * find /home/oraclebackup/* -name "YHBS...表示每天早上六点删除/root/home/zhang目录下一天创建所有文件,不删除文件夹z...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 954
精华内容 381
关键字:

删除目录前的点