当报告“参数列表太长”时,如何从目录中删除所有文件

我有一个数十万个文件的目录。

我想删除所有文件,但是rm * -f报告:“参数列表太长”

清除此目录的最佳方法是什么?

如果你不能删除目录,你总是可以使用find。

find . -maxdepth 1 -type f -exec rm -f {} \; 

这将删除当前目录中的所有文件,只删除当前目录(不是子目录)。

找 。  -maxdepth 1 -type f -exec rm -f {} \;

它只是需要很长的时间(每个文件rm的一个执行)。

这一个更有效率:

找 。  -maxdepth 1 -type f -print0 |  xargs -r0 rm -f

因为它尽可能多地接受rm的参数文件名,然后用下一个文件名负载运行rm …可能发生rm只被调用2或3次。

这两个都会解决问题。 有一个在这里分别对每种技术的性能分析。

 find . -name WHATEVER -exec rm -rf {} \; 

要么

 ls WHATEVER | xargs rm -rf 

这个问题源于bash在目录中用“*”号扩展“*”。 这两个解决scheme反过来依次通过每个文件。

我能够通过备份一个级别来做到这一点:

cd ..

并运行:

rm directory name -rf

然后重新创build目录。

所有这些发现的调用都非常好,但我很less记得我急需的命名,而是使用ls。 正如有人提到的,LS。 会工作,但我更喜欢ls -1在:

ls -1 | xargs -n 100 rm -rf

-n xxxgraphics是非常安全的,因为超过最大值将自动更正(如果超过size-max;请参阅-s),或者如果应用程序的args-max超出,通常会是明显。

应该注意的是,当你只想删除一个大目录中的文件子集时,grep很方便插入到这个链的中间,并且不pipe出于什么原因都想使用find。

这个答案假定你正在为你的ls,xargs等使用Gnu核心工具。

您可以使用-exec +选项来查找哪个尝试运行rm的次数尽可能less,这可能会更快。

 find . -type f -exec rm '{}' + 

这是一个当系统需要保持响应时删除大量文件的版本。

它通过小批量发布(默认为100个文件)并等待其他作业完成。

在ext3上从单个目录删除超过五十万个文件出色地工作。 它打印的百分比做一点奖金

 noOfFiles=`ls -U | wc -l` n=0 while (ls -U | tail -n 100 | xargs rm -f); do n=$((n+100)); sync; echo -en "$((n*100/noOfFiles))%, ($n of $noOfFiles)\r"; sleep 5; done 

解决“参数太长”或“无法分配内存”的错误

这在220,000以上的会话文件夹中的窍门….

优点:立即开始删除文件

  cdpath/到/文件夹 
  ls -f |  xargs rm -f -v 

单击正在删除的文件的屏幕截图 – (在〜15分钟内删除所有文件)

-f (在ls之后)保持不变

-v (在RM之后)显示每个文件被删除

-f (在rm之后)在写保护文件上强制通过而没有提示

提示:在尝试删除文件时,首先要重命名文件夹(例如会话到session_old)以保持添加其他自动生成的文件。 如果不是像我的情况那样自动重新创build原始目录