代码之家  ›  专栏  ›  技术社区  ›  anon

Unix:用于清理每日生成的快速“删除目录”

  •  19
  • anon  · 技术社区  · 15 年前

    有没有更快的方法删除一个目录然后简单地提交

    rm -r -f *directory*
    

    ?我这样问是因为我们每天的跨平台构建非常庞大(例如,每个构建4GB)。因此,一些机器上的硬盘经常会耗尽空间。

    这就是我们的AIX和Solaris平台的情况。

    也许在这些平台上有“特殊”的目录删除命令?

    粘贴-编辑(将我自己的独立答案移到问题中):

    我通常想知道为什么“rm-r-f”这么慢。“rm”不需要修改“..”或“.”文件即可取消分配文件系统项。

    类似的东西

    mv *directory* /dev/null
    

    会很好。

    12 回复  |  直到 10 年前
        1
  •  22
  •   Balázs Pozsár    15 年前

    对于从文件系统中删除目录,rm是最快的选项。 在Linux上,有时我们在ramdisk上进行构建(几GB),它的删除速度非常快:)您也可以尝试不同的文件系统,但在AIX/Solaris上,您可能没有很多选项…

    如果您的目标是让目录$dir为空 现在 ,您可以重命名它,稍后从background/cron作业中删除它:

    mv "$dir" "$dir.old"
    mkdir "$dir"
    # later
    rm -r -f "$dir.old"
    

    另一个技巧是为$dir创建一个单独的文件系统,当您想删除它时,只需重新创建文件系统即可。像这样:

    # initialization
    mkfs.something /dev/device
    mount /dev/device "$dir"
    
    
    # when you want to delete it:
    umount "$dir"
    # re-init
    mkfs.something /dev/device
    mount /dev/device "$dir"
    
        2
  •  17
  •   yegle    11 年前

    我忘记了这个技巧的来源,但它起作用:

    EMPTYDIR=$(mktemp -d)
    rsync -r --delete $EMPTYDIR/ dir_to_be_emptied/
    
        3
  •  5
  •   paxdiablo    15 年前

    至少在AIX上,您应该使用逻辑卷管理器LVM。我们所有的系统都将所有的物理硬盘打包成一个卷组,然后从中创建一个大的Honkin文件系统。

    这样,您可以随意向您的计算机添加物理设备,并将文件系统的大小增加到您需要的任何内容。

    我看到的另一个解决方案是在每个文件系统上分配一个垃圾目录,并使用 mv 和A find cron 解决空间问题的工作。

    基本上,有一个 克朗 每十分钟运行一次并执行的作业:

    rm -rf /trash/*
    rm -rf /filesys1/trash/*
    rm -rf /filesys2/trash/*
    

    然后,当您希望回收该文件系统上的特定目录时,请使用如下内容:

    mv /filesys1/overnight /filesys1/trash/overnight
    

    在接下来的十分钟内,您的磁盘空间将开始恢复。这个 filesys1/overnight 即使在垃圾版本开始被删除之前,目录也将立即可用。

    垃圾目录与要删除的目录位于同一个文件系统上,这一点很重要,否则您将拥有大量的复制/删除操作,而不是相对快速的移动。

        4
  •  3
  •   Sam Watkins    15 年前

    如果 rm -rf 速度很慢,可能您使用的是“同步”选项或类似选项,这太频繁地写入磁盘。在带有普通选项的Linux ext3上, 射频-射频 很快。

    快速删除的一个选择是使用循环设备,例如:

    hole temp.img $[5*1024*1024*1024]  # create a 5Gb "hole" file
    mkfs.ext3 temp.img
    mkdir -p mnt-temp
    sudo mount temp.img mnt-temp -o loop
    

    “hole”程序是我自己编写的一个程序,它使用“hole”而不是磁盘上分配的块来创建一个大的空文件,速度快得多,在真正需要它之前不会占用任何磁盘空间。 http://sam.nipl.net/coding/c-examples/hole.c

    我刚刚注意到gnu coreutils包含一个类似的程序“truncate”,因此如果您有这样的程序,可以使用它来创建图像:

    truncate --size=$[5*1024*1024*1024] temp.img
    

    现在,您可以使用mnt temp下的挂载映像作为构建的临时存储。完成操作后,请执行以下操作将其移除:

    sudo umount mnt-temp
    rm test.img
    rmdir mnt-temp
    

    我想你会发现删除单个大文件比删除大量小文件要快得多!

    如果你不想编译我的“hole.c”程序,你可以使用dd,但这要慢得多:

    dd if=/dev/zero of=temp.img bs=1024 count=$[5*1024*1024]  # create a 5Gb allocated file
    
        5
  •  3
  •   Tommy McGuire    15 年前

    rm -r directory 先向下通过递归深度进行工作 目录 ,删除文件,并在备份过程中删除目录。必须删除,因为不能删除非空目录。

    冗长乏味的细节:每个文件系统对象都由文件系统中的inode表示,该inode具有文件系统范围内的、inode的平面数组。 目录 如果不先删除它的子级,那么子级将保持分配状态,但没有任何指向它们的指针。( fsck 在运行时检查是否存在这种情况,因为它代表文件系统损坏。)

    [1]对于所有的文件系统来说,这可能并不完全正确,而且可能有一个文件系统按照您描述的方式工作。它可能需要类似垃圾收集器的东西。然而,我所知道的所有普通的 行为 与fs对象一样,inode拥有这些对象,目录也是name/inode-number对的列表。

        6
  •  2
  •   Michael Zilbermann    15 年前

    我认为实际上除了你引用的“rm-rf”来删除你的目录之外,没有别的了。

    为了避免反复手动操作,您可以每天cron一个脚本,该脚本递归地删除构建根目录的所有构建目录(如果它们“足够旧”),如下所示:

    find <buildRootDir>/* -prune -mtime +4 -exec rm -rf {} \;
    

    (此处mtime+4表示“任何超过4天的文件)

    另一种方法是配置构建器(如果它允许这样做),将前一个构建与当前的构建粉碎。

        7
  •  2
  •   rohit_gupta    10 年前

    使用 perl-e'(<*>)((stat)[9]<(unlink))' 请参阅以下链接: http://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux

        8
  •  1
  •   Scott    13 年前

    我也在调查这个。

    我有一个60多万个文件的目录。

    RM*会失败,因为条目太多。

    find . -exec rm {} \; 很好,每5秒钟删除大约750个文件。正在通过另一个shell检查RM费率。

    所以,我一次写了一个简短的脚本给rm许多文件。每5秒获取大约1000个文件。其思想是尽可能多地将文件放入一个rm命令中,以提高效率。

    #!/usr/bin/ksh
    string="";
    count=0;
    for i in $(cat filelist);do
        string="$string $i";
        count=$(($count + 1));
      if [[ $count -eq 40 ]];then
        count=1;
        rm $string
        string="";
      fi
    done
    
        9
  •  1
  •   Roman C    11 年前

    在Solaris上,这是我找到的最快的方法。

    find /dir/to/clean -type f|xargs rm
    

    如果有路径奇怪的文件,请使用

    find /dir/to/clean -type f|while read line; do echo "$line";done|xargs rm 
    
        10
  •  0
  •   gnuyoga    11 年前

    我不得不在Windows中删除超过30000个文件。我安装了Cygwin。幸运的是,我在一个数据库中拥有所有的主目录。使用rm-rf创建了for循环并基于行输入和删除

        11
  •  0
  •   Mark306    10 年前

    需要先从AWS EBS 1 TB磁盘(ext3)上的几十个目录中删除700 GB,然后再将其余部分复制到新的200 GB XFS卷。它花了几个小时的时间,使容量保持在100%的西澳州。由于磁盘IO和服务器时间不空闲,因此每个目录只占用了一小部分时间。

    何处/开发/ SDB 是任意大小的空卷

    目录删除=/ebs/var/tmp/

    mount/dev/sdb$目录\要删除

    nohup rsync-avh/ebs//ebs2/

        12
  •  0
  •   Tony    10 年前

    我编写了一个小的Java应用程序RdPro(递归目录清除工具),它比RM快。它还可以删除用户在根目录下指定的目标目录。适用于Linux/Unix和Windows。它同时具有命令行版本和GUI版本。

    https://github.com/mhisoft/rdpro