我有一个数十万个文件的目录。
我想删除所有文件,但是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原始目录