一个测试不佳的程序在 NFS 共享上创建了一个包含大量文件的目录,我需要删除这些文件。
ls -ald /home/foo
drwxrwxr-x 2 503 503 317582336 Jul 29 11:38 /home/foo
Run Code Online (Sandbox Code Playgroud)
该目录位于 netapp 类型设备上大约 600GB 的 NFS 安装上。我实际上不知道其中有多少文件,但仅在 10 分钟后创建的类似目录就有 121,000 个文件,因此某处可能有数百万个文件。操作系统是 Linux 2.6 内核。
试图找到一种列出或删除它及其内容的方法。find /home/foo 导致 find 在大约 1 小时后死亡,除了“./”之外没有任何输出
(回答我自己的问题,以防有人在搜索类似内容时找到它。)目录中可能有多达 900 万个文件。
不幸的是不能直接登录服务器,它是一个设备。对文件系统的唯一访问是通过导出。
rm -rf 似乎不起作用。用 strace 看着它挂着。
find 没有完成,没有错误就死了。
ls -1 似乎从未完成。(我现在意识到它试图对结果进行排序, ls -1f 最终可能会起作用)。
有效的是一个简单的 perl 片段。我假设 c 代码做同样的工作。
opendir( my $dh, '/home/foo' ) or die $!
while ( my $file = readdir $dh ) {
print "$file\n";
}
Run Code Online (Sandbox Code Playgroud)
这个相当古老的线程在谷歌上出现了,所以我想分享一些统计数据。
以下是在 NFS 服务器上删除文件的三种不同方法的比较:
rm dir/*
find dir/ -type f -exec rm {} \;
tempdir=$( mktemp -d ); \
rsync -a --delete $tempdir/ dir/; \
rmdir $tempdir
为了比较这些方法,我每次运行测试时都会创建 10000 个文件
for i in {1..10000} ; do touch $i ; done
Run Code Online (Sandbox Code Playgroud)
图中的结果表明,rsync 速度要快得多,而 find 是三种方法中最慢的
当文件数量加倍时(我没有运行find
20000 个文件),结果保持不变,平均时间为 10000 个文件运行 3 次和 20000 个文件运行 2 次。
10000 20000
find 28.3 -
rm 12.9 23.9
rsync 6.94 12.2
Run Code Online (Sandbox Code Playgroud)
有趣的是,看看这些方法的性能还取决于什么。
该网站上的一篇相关文章讨论了删除 ext3 文件系统上的大量文件。
小智 1
也许find /home/foo -mount -depth -type f -exec rm -f {} \;
会有帮助。
-exec
使find
执行命令(以分号结束:)\;
,其中大括号{}
替换为文件的路径名。
这意味着rm
每个要删除的文件都有一个进程。
-type f
仅对文件执行此操作,如果 /home/foo 下有目录结构,则目录将保留。仅文件将被删除。