我有一个目录,其中包含大量非常小的文件,我想删除这些文件,并且简单地删除该目录rm -rf /path/to/the/dir
已经需要几天的时间。
这听起来很奇怪,这速度很慢,但该目录不是常规文件系统上的目录。它是集群的 Lustre 文件系统上的一个目录。
rm
我在安装了 Lustre 的集群节点 A 上运行该命令,但 Lustre 的后端有 2 个 ZFS 文件系统,一个在节点 B 上,一个在节点 C 上,因此所有网络流量可能是导致rm
速度变慢的原因。
有谁知道比我的方法更快的删除目录的方法?
答案1
一些 GNU 命令,例如在 Lustre 上操作大类文件时,tar 和 rm 效率低下。例如,对于数百万个文件,rm -rf * 可能需要几天的时间,并且对其他用户的 Lustre 产生相当大的影响。
原因就在于扩大外卡所需要的时间。
一种更好的方法是生成要删除或压缩的文件列表,并一次处理一个或一小部分。
一个好方法在删除文件之前检查文件如下:
$ lfs find <dir> -t f > rmlist.txt
$ vi rmlist.txt
$ sed -e 's:^:/bin/rm :' rmlist.txt > rmlist.sh
$ sh rmlist.sh
# the directory structure will remain, but unless there are many directories, we can simply delete it:
$ rm -rf <dir>
Lustre IO 的一些有用参考:
1.https://www.nics.tennessee.edu/computing-resources/file-systems/io-lustre-tips
2.https://www.rc.colorado.edu/support/examples-and-tutorials/parallel-io-on-janus-lustre.html
谢谢!
答案2
使用 munlink:
find -P $dir -type f -o -type l -print0 | xargs -0 munlink
...并删除空目录:
find -P $dir -depth -type d -empty -delete
我用更多参数更新了查找结果。参考:https://support.pawsey.org.au/documentation/display/US/Deleting+Large+Numbers+of+Files+on+Lustre+Filesystems
答案3
由于到目前为止我还没有获得足够的声誉,所以我无法评论@Atisom 的解决方案,因此有一个新的答案:
Atisom 解决方案中显示的命令find
不起作用,因为find
将匹配-type f
或-type l -print0
要使其正常工作,请添加括号:
find -P $dir \( -type f -o -type l \) -print0 | xargs -0 munlink