如何并行删除多个文件夹?

13

我有两个在同一级别的目录,我可以这样做:

rm -rf dir1/; rm -rf dir2/

但它们将按顺序运行,我该如何并行删除它们?是否有通用解决方案可以扩展到许多文件夹?

更新

目录可能会包含其他目录,以此类推,这些目录可能会嵌套得很深。


1
为什么你不使用 &rm -rf dir1/& rm -rf dir2/。这样,Bash 就不会等待第一个命令(删除 dir1)开始执行第二个命令。 - Auzias
我不确定为什么有人会踩这个问题。虽然给出的示例确实很弱,但这是一个好问题。看看我的答案,使用GNU Parallel进行酷炫的Bash并行处理。希望对你有所帮助。 - ferdy
1
@tink,我认为你可能是对的。但是当我编写脚本时,我已经多次使用了这种方法(在bash中并行执行某些操作)。这可能是一个哲学问题,简单的shell脚本是否应该被视为编码。我会说是的。但是运维问题本身与此有些远离。 - ferdy
@vivek,你能解释一下那些目录中文件的性质吗?你有大量的文件吗?大量的子目录?大型文件等等? - Raju
7个回答

20

在后台运行命令

rm -rf dir &; rm -rf dir2 &;
语法
long_command with arguments > redirection &

通过将命令输出重定向到文件,您可以捕获任何消息。

这些链接将有所帮助 ==> http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html

编辑:

问题标题和示例给人的印象是问题很小。但是添加赏金表明了问题的严重性。

如果您指定文件类型,效果会更好。不过,我提供一些基于分割的删除选项,可以并行执行。根据您的需求,您可以尝试以下选项:

  • 按大小删除文件
  • find /yourpath/folder1 -size +1048576 -exec rm -f {} \; &
    find /yourpath/folder2 -size +1048576 -exec rm -f {} \; &
    

  • 按文件扩展名删除文件
  • 使用以下命令查找扩展名

    ls -l /yourpath/folder1 | awk '{print $9}' | awk -F. '{print $(NF)}' |sort |uniq
    

    你可能会得到类似的结果

    .txt
    .log
    .tmp
    .zip
    

    现在,根据文件扩展名删除文件。

    find yourpath/folder1 -name '*.txt' -exec rm {} \; &
    find yourpath/folder1 -name '*.tmp' -exec rm {} \; &
    find yourpath/folder1 -name '*.log' -exec rm {} \; &
    find yourpath/folder2 -name '*.txt' -exec rm {} \; &
    find yourpath/folder2 -name '*.tmp' -exec rm {} \; &
    find yourpath/folder2 -name '*.log' -exec rm {} \; &
    

  • 按修改时间删除文件
  • 下面的命令尝试删除5天之前的文件。

    find yourpath/folder1 -mtime +5 -exec rm {} \;
    
    find yourpath/folder2 -mtime +5 |xargs rm 
    
    删除文件夹及其子文件夹以及其中的文件。
    find foldername -exec rm -rf {} \; &
    

    示例文件夹和子文件夹结构


    2
    在 & 后面不需要加上 ;。如果他有很多目录,可以使用 for 循环来完成:for d in dir*; do rm $d& done - Colin Pitrat

    11

    如果你想做更多的并行操作而不仅仅是删除目录,你可以使用GNU parallel来进行许多并行操作。由于它通常不是发行版中的基本工具,因此您可能需要使用您喜欢的软件包管理器(例如apt-get install parallel)进行安装。

    然后,您可以像这样做一些很酷的事情,比如运行4个并行进程,显示进度,没有烦人的提示,并让并行运行一个等待5秒、10秒、15秒和20秒的休眠命令。

    $ parallel -j 4 --progress --no-notice sleep ::: 5 10 15 20 
    
    Computers / CPU cores / Max jobs to run
    1:local / 4 / 4
    
    Computer:jobs running/jobs completed/%of started jobs/Average seconds to complete
    local:0/4/100%/5.0s  
    

    你的例子将会像这样运行:

    $ parallel --no-notice rm -rf ::: dir1 dir2 dir3 
    

    请随意查阅优秀的教程


    3
    我会尝试翻译以下内容:使用 find dir1 dir2 dir3 -type f | parallel --jobs 0 -a - rm {}; find dir1 dir2 dir3 | parallel --jobs 0 -a - rm -rf {}。该命令用于查找目录dir1、dir2、dir3中的文件,并删除它们。第一部分(find dir1 dir2 dir3 -type f | parallel --jobs 0 -a - rm {})会查找目录中的所有文件,然后使用并行处理工具parallelrm命令删除这些文件。第二部分(find dir1 dir2 dir3 | parallel --jobs 0 -a - rm -rf {})则会递归地查找目录中的所有子目录,并删除它们及其内容。 - smac89

    2

    我需要尽快清理/media文件夹中的一些文件夹。
    以下命令可以在大约5分钟内删除80个磁盘上每个磁盘的9T数据。

    $ sudo find /media -maxdepth 2 -name "data-8" -type d | while read folder; do eval "sudo rm -rf ${folder} &"; done
    

    这个命令在后台启动了80个并发的rm -rf


    在使用 sudo 时,记得特别小心地使用 rm -rf - astorga

    -1
    非常简单!!!
    rm -r 文件夹1 文件夹2 文件夹3

    虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 - Yunnosch

    -2

    创建一个纯文本文件夹列表(即list_delfolders),然后在for循环或while循环中运行。 $ cat list_delfolders | while read ids; do rm -rf“$ids”;done


    1
    这并没有回答如何并行删除的问题。 - Jonathan Jacobson

    -2

    2020年更新

    如果有人因同样的问题再次访问此页面,我认为以下方法会更加容易:

    1. 进入包含其他子文件夹或要批量删除的文件的文件夹。我们称之为目标文件夹,因此执行以下命令:

       cd 目标文件夹
      
    2. 输入ls -la并按回车键。

       [home@target_folder]$ ls -la
      
    3. 它将列出所有子文件夹和文件。现在是最后一步。输入:

       [home@target_folder]$ rm -rf {folder1,folder2,folder3,so on...}
      

    只需双击文件名,右键粘贴即可完成操作。当您列出所有文件名后,按Enter键,所有文件夹或文件都将被删除。


    1
    这并没有回答如何并行删除的问题。 - Jonathan Jacobson

    -3
    简单解决方案: 进入目标文件夹,执行 rm -r '某个正则表达式',与正则表达式匹配的文件夹将被删除。

    3
    这并没有回答如何并行删除的问题。 - Jonathan Jacobson

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接