我们遇到一个问题,即文件夹因包含数十万个小文件而变得笨重。
有很多文件执行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}'
资料来源:
答案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