如何用大量的文件删除NFS文件系统上的目录

一个testing不佳的程序在NFS共享上创build了一个包含大量文件的目录,我需要将其删除。

ls -ald /home/foo drwxrwxr-x 2 503 503 317582336 Jul 29 11:38 /home/foo 

该目录位于netapp型设备上的大约600GB的NFS挂载点上。 我一般不知道里面有多less个文件,只有10分钟后创build了一个类似的目录,有121,000个文件,所以它可能在几百万的地方。 OS是Linux 2.6内核。

试图find一种方式来列出或删除它及其内容。 find/ home / foo导致大约1小时后死机,除“./”

(回答我自己的问题,以防有人在search时发现它)。目录中可能有多达900万个文件。

不幸的是无法直接login服务器,这是一个设备。 唯一的访问文件系统是通过导出。

rm -rf似乎没有工作。 看着它是挂着的。

发现没有完成,没有错误死亡。

ls -1似乎从来没有完成。 (我现在意识到它试图对结果进行sorting,ls-1f最终可能会起作用)。

什么工作是一个简单的perl片段。 我假设c代码做同样的工作。

  opendir( my $dh, '/home/foo' ) or die $! while ( my $file = readdir $dh ) { print "$file\n"; } 

我build议你不要尝试通过NFS删除这些文件 – 直接login到文件服务器并删除那里的文件。 这将大大减lessNFS服务器(和客户端)的滥用。

除此之外,使用find(如MattBianco所述)或使用ls -1 | xargs rm -f ls -1 | xargs rm -f (从该目录内),如果发现有困难完成(后者应该通过NFS工作正常,虽然我会build议在本地做)。

这个相当古老的线程在Google上为我提供,所以我想分享一些统计数据。

下面是在NFS服务器上删除文件的三种不同方法的比较:

  1. 普通rmrm dir/*
  2. findfind dir/ -type f -exec rm {} \;
  3. rsynctempdir=$( mktemp -d ); \ rsync -a --delete $tempdir/ dir/; \ rmdir $tempdir tempdir=$( mktemp -d ); \ rsync -a --delete $tempdir/ dir/; \ rmdir $tempdir

为了比较这些方法,我每次运行一个testing时都创build了10000个文件

 for i in {1..10000} ; do touch $i ; done 

情节结果显示rsync速度更快,发现是三种方法中最慢的 性能不同的方法删除多个文件,rsync更快

当文件数量加倍(我没有在20000个文件上运行find )时,结果保持不变,对10000个文件的平均时间超过3次,20000个文件的时间平均为2次。

  10000 20000 find 28.3 - rm 12.9 23.9 rsync 6.94 12.2 

看到这些方法的性能还有什么依赖是很有趣的。

本网站上的一篇相关文章讨论了删除ext3文件系统上的大量文件。

也许find /home/foo -mount -depth -type f -exec rm -f {} \; 可能会有所帮助。
-exec使find执行一个命令(以分号结束: \; ),用大括号replace文件的path名。
这意味着要删除每个文件的一个rm进程。
-type f只能用于文件,如果在/ home / foo下有一个目录结构,目录将保留。 只有文件将被删除。

这似乎有点明显,但你有没有尝试过:

 rm -rf /home/foo/ 

? 如果不这样做,有没有一种方法可以使用正则expression式来获得足够小的子集来交给|xargs rm

如果ls失败,你可以尝试echo /home/foo/* | xargs rm echo /home/foo/* | xargs rm虽然这可能只是因为“线路太长”等原因而失败。 哦,我build议尝试直接在服务器上而不是在NFS上执行此操作。