Tob*_*oby 233 linux command-line rm files
我们有一个文件夹变得笨重的问题,其中包含数十万个小文件。
执行rm -rf返回错误的文件太多了,而我们需要做的是:
find /path/to/folder -name "filenamestart*" -type f -exec rm -f {} \;
这有效,但速度非常慢,并且经常因内存不足而失败。
有一个更好的方法吗?理想情况下,我想删除整个目录而不关心其中的内容。
小智 313
使用 rsync 非常快速和简单。
mkdir empty_dir
rsync -a --delete empty_dir/ yourdirectory/
Run Code Online (Sandbox Code Playgroud)
@sarath 的回答提到了另一个快速选择:Perl!?它的基准测试比rsync -a --delete.
cd yourdirectory
perl -e 'for(<*>){((stat)[9]<(unlink))}'
Run Code Online (Sandbox Code Playgroud)
或者,没有stat(是否需要它是有争议的;有人说使用它可能更快,而其他人说没有它更快):
cd yourdirectory
perl -e 'for(<*>){unlink}'
Run Code Online (Sandbox Code Playgroud)
资料来源:
MZA*_*web 28
一个巧妙的技巧:
rsync -a --delete empty/ your_folder/
Run Code Online (Sandbox Code Playgroud)
这是超级 CPU 密集型,但真的非常快。见https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html
dig*_*ity 19
怎么样:
find /path/to/folder -name "filenamestart*" -type f -print0 | xargs -0rn 20 rm -f
您可以通过更改 parameter 的参数来限制一次删除的文件数-n。还包括带空格的文件名。
Izk*_*ata 14
扩展其中一条评论,我认为您没有在做您认为正在做的事情。
首先,我创建了大量文件,以模拟您的情况:
$ mkdir foo
$ cd foo/
$ for X in $(seq 1 1000);do touch {1..1000}_$X; done
Run Code Online (Sandbox Code Playgroud)
然后我尝试了我期望失败的方法,以及您在问题中所做的事情:
$ rm -r foo/*
bash: /bin/rm: Argument list too long
Run Code Online (Sandbox Code Playgroud)
但这确实有效:
$ rm -r foo/
$ ls foo
ls: cannot access foo: No such file or directory
Run Code Online (Sandbox Code Playgroud)
小智 10
我有机会测试-delete相比-exec rm \{\} \;,对我来说-delete就是这个问题的答案。
使用-delete删除文件夹中 400,000 个文件的文件至少比rm.
“如何在 linux 中删除大量文件”一文表明它大约快了三倍,但在我的测试中,差异要大得多。
Jos*_*ter 10
rm -rf directory代替rm -rf *。我们最初rm -rf *是在目录中清除内容,并认为这是尽可能快的。但是后来我们的一位高级工程师建议我们避免使用星号 ( *),而是传入父目录,例如rm -rf directory.
在关于这不会产生什么影响的激烈辩论之后,我们决定对其进行基准测试,以及使用find. 结果如下:
time rm -rf * 2m17.32s
time rm -rf directory 0m15.60s
time find directory -delete 0m16.97s
Run Code Online (Sandbox Code Playgroud)
rm -rf directory大约比rm -rf *!快 9 倍!
不用说,我们给那个工程师买了啤酒!
所以现在我们使用rm -rf directory; mkdir directory删除目录并重新创建它。
小智 6
关于-delete上面的选项:我正在使用它删除我创建的临时文件夹中的大量(1M+ est)文件,但无意中忘记了每晚清理。我不小心填满了我的磁盘/分区,除了find .命令之外没有其他任何东西可以删除它们。它很慢,起初我使用的是:
find . -ls -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)
但这需要花费大量时间。它在大约 15 分钟后开始删除一些文件,但我的猜测是它在最终启动后每秒删除不到 10 个左右。所以,我尝试了:
find . -delete
Run Code Online (Sandbox Code Playgroud)
相反,我现在让它运行。它似乎运行得更快,尽管它对 CPU 的负担非常大,而另一个命令则没有。它已经运行了大约一个小时,我想我的驱动器上的空间正在恢复,并且分区逐渐“缩小”,但仍然需要很长时间。我严重怀疑它的运行速度比另一个快 1,000 倍。和所有事情一样,我只是想指出空间与时间的权衡。如果您有足够的 CPU 带宽(我们有),则运行后者。它让我的 CPU 正在运行(uptime报告):
10:59:17 up 539 days, 21:21, 3 users, load average: 22.98, 24.10, 22.87
Run Code Online (Sandbox Code Playgroud)
我已经看到平均负载超过 30.00,这对于繁忙的系统来说并不好,但对于我们通常负载较轻的系统来说,几个小时就可以了。我已经检查了系统上的大多数其他内容,它们仍然有响应,所以我们现在还可以。
小智 5
有几种方法可用于在 linux 中删除大量文件。您可以将 find 与 delete 选项一起使用,这比 exec 选项更快。然后你可以使用 perl unlink,然后甚至是 rsync。 linux下如何删除大量文件
小智 -1
ls -1 | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)
应该在主文件夹内工作