高效删除包含数千个文件的大型目录

高效删除包含数千个文件的大型目录

我们遇到一个问题,即文件夹因包含数十万个小文件而变得笨重。

有很多文件执行rm -rf会返回错误,而我们需要做的是:

find /path/to/folder -name "filenamestart*" -type f -exec rm -f {} \;

这可以工作,但速度非常慢,并且经常因内存不足而失败。

有一个更好的方法吗?理想情况下,我想删除整个目录而不关心其中的内容。

答案1

使用 rsync 是令人惊讶的快速和简单。

mkdir empty_dir
rsync -a --delete empty_dir/    yourdirectory/

@sarath的回答提到了另一个快速选择:Perl!它的基准测试比rsync -a --delete.

cd yourdirectory
perl -e 'for(<*>){((stat)[9]<(unlink))}'

或者,没有stat(是否需要它是有争议的;有人说使用它可能会更快,而另一些人说没有它会更快):

cd yourdirectory
perl -e 'for(<*>){unlink}'

资料来源:

  1. https://stackoverflow.com/questions/1795370/unix-fast-remove-directory-for-cleaning-up-daily-builds
  2. http://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux
  3. https://www.quora.com/Linux-why-stat+unlink-can-be-faster-than-a-single-unlink/answer/Kent-Fredric?srid=O9EW&share=1

答案2

有人在推特建议使用-delete而不是-exec rm -f{} \;

这提高了命令的效率,但它仍然使用递归来遍历所有内容。

答案3

一个巧妙的技巧:

rsync -a --delete empty/ your_folder/

它是超级 CPU 密集型的,但速度非常快。看https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html

答案4

扩展其中一条评论,我不认为您正在做您认为正在做的事情。

首先,我创建了大量文件来模拟您的情况:

$ mkdir foo
$ cd foo/
$ for X in $(seq 1 1000);do touch {1..1000}_$X; done

然后我尝试了我预期会失败的事情,以及听起来你在问题中所做的事情:

$ rm -r foo/*
bash: /bin/rm: Argument list too long

但是这个工作:

$ rm -r foo/
$ ls foo
ls: cannot access foo: No such file or directory

相关内容