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


Answers:


11

如果您无法删除目录,则可以始终使用find。

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

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


几乎完美(也请参阅我的帖子)
asdmin

2
在Linux上,您可以使用“ +”而不是“ \;”来更快地完成此任务。这将导致它一次删除“ rm”中的更多文件。
Thomas Thomas

5
甚至更快:(find dir/to/delete -delete不为rm每个文件生成要删除的进程)。
Morten Siebuhr,2009年

莫滕:他从未提到要删除目录本身,而是对文件说。find dir/to/delete -type f -delete
richo 2010年

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

它只是花费太长时间(每个文件一个rm可执行文件)。

这一效率更高:

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

因为它会尽可能多地使用rm参数的文件名,然后在下一次加载文件名时运行rm ...可能会发生rm仅被调用2到3次的情况。


5
很高兴看到有人知道find的工作原理...还考虑使用新的gnu find的-delete动作或-exec命令{} +,其作用类似于xargs。请参阅“寻人”的“操作”部分。
凯尔·布​​兰特

我不知道-exec cmd {} +。这看起来很有用。比-delete稍微通用一些:)
David Pashley 09年

-delete可能很好,但是我个人更喜欢可以在各种机器上使用的命令。我使用的Solaris系统较旧,因此-delete无法在其上使用
asdmin

2
如果其他人同时使用计算机,则ionice在之前添加rm是个好主意。
休伯特·卡里奥

6

这些都将解决问题。有在每个技术的各自表现的分析在这里

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

要么

ls WHATEVER | xargs rm -rf

问题源于bash用目录中的每个项目扩展“ *”。这两种解决方案都依次处理每个文件。


2
对于许多文件,find解决方案速度较慢,因为它会为每个文件调用rm命令。xargs解决方案速度更快,但仅在文件名不包含空格(否则需要GNU find和find . -print0 | xargs -0 rm)时才有效。
2009年

“查找。-name无论如何-print0 | xargs -0 rm -rf”将更加有效。find将为每个文件派生一个rm,因为xargs会将其减小到最小。您需要-print0和-0来处理带有空格的文件。您可能还想在查找时使用-depth,因此它会进行深度优先搜索。
David Pashley 09年

ls命令将不起作用,因为它也会返回“参数列表太长”
Brent

2
您正在执行“ ls *”,“ *”将扩展到您的shell抱怨过长的参数列表。ls .改为使用“ ”(或向上一级目录执行“ ls [dirname]”)。
James Sneeringer

第二个命令行(ls WHATEVER | xargs rm -rf)由于与问题不起作用相同的原因而无法工作:shell会将东西替换为超出长度的东西
asdmin

3

我可以通过备份一个级别来做到这一点:

cd ..

并运行:

rm directory name -rf

然后重新创建目录。


1
仅当您不必永久拥有该目录且所有文件和目录将被递归删除时,它才起作用。我一生中大多数情况下,这种方式都行不通。
asdmin

2

所有这些查找调用都非常好,但是我很少记得我急忙时需要的术语:相反,我使用ls。就像有人提到的那样,ls。可以工作,但是我更喜欢ls -1:

ls -1 | xargs -n 100 rm -rf

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

应该注意的是,当您只想删除大目录中的文件子集,并且出于某种原因而不想使用find时,grep可以方便地插入到此链的中间。

该答案假设您正在为ls,xargs等使用Gnu核心实用程序。


可以使用太大的目录使“ ls”无法工作吗?(相同的错误-争论列表太长)
布伦特

是的Brent:只需确保在调用ls时不使用filespec。如上所示,仅使用-1(破折号1)。并且如上所述,如果需要配对文件列表,请在ls之后使用grep。如果确定没有在ls中使用任何通配符后出现“过长”错误,则可能是xargs在抱怨。使用'xargs -n 5'代替'xargs -n 100',如果速度稍慢一点,则绝对应该安全。
rixtertech

1

您可以使用该-exec +选项找到哪个将尝试运行rm的次数越少越好,这可能会更快。

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

0

这是用于在系统需要保持响应速度时删除大量文件的版本。

它的工作方式是分批分发工作(默认情况下为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

0

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

这对会话文件夹中的220,000+个文件起到了作用

优点:立即开始删除文件

cd路径/到/文件夹
ls -f | xargs rm -f -v

单击以查看要删除的文件的屏幕截图 - (在15分钟内删除了所有文件)

-f (ls之后)不进行预排序

-v (在rm之后)将每个文件显示为已删除

-f (在rm之后)强制进行写保护的文件而没有提示

提示:首先,将文件夹重命名(例如,将会话重命名为session_old),以防止在尝试删除文件时添加其他自动生成的文件。您可以手动重新制作原始目录(如果不是我这种情况)


您的答案中有哪些新内容是以前的内容遗漏的?
user2233709 '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.