Brent Asked: 2009-07-25 07:58:30 +0800 CST2009-07-25 07:58:30 +0800 CST 2009-07-25 07:58:30 +0800 CST 当它报告“参数列表太长”时,如何从目录中删除所有文件 772 我有一个目录,里面有几十万个文件。 我想删除所有文件,但 rm * -f 报告:“参数列表太长” 清除此目录的最佳方法是什么? linux debian 8 个回答 Voted asdmin 2009-07-25T09:52:04+08:002009-07-25T09:52:04+08:00 寻找 。-maxdepth 1 -type f -exec rm -f {} \; 它只需要太长时间(每个文件一个 rm 执行)。 这个效率更高: 寻找 。-maxdepth 1 -type f -print0 | xargs -r0 rm -f 因为它需要尽可能多的文件名作为 rm 的参数,然后在下一次加载文件名时运行 rm ......可能会发生 rm 只被调用 2 或 3 次。 Best Answer skraggy 2009-07-25T08:08:02+08:002009-07-25T08:08:02+08:00 如果您无法删除目录,您可以随时使用 find。 find . -maxdepth 1 -type f -exec rm -f {} \; 这将删除当前目录中的所有文件,并且只删除当前目录(不是子目录)。 Coops 2009-07-25T08:05:27+08:002009-07-25T08:05:27+08:00 这两个都可以解决问题。这里对每种技术的各自性能进行了分析。 find . -name WHATEVER -exec rm -rf {} \; 或者 ls WHATEVER | xargs rm -rf 问题源于 bash 用目录中的每个项目扩展“*”。这两种解决方案都依次处理每个文件。 Brent 2009-07-25T08:01:42+08:002009-07-25T08:01:42+08:00 我可以通过备份一个级别来做到这一点: cd .. 并运行: rm directory name -rf 然后重新创建目录。 rixtertech 2009-07-29T05:02:28+08:002009-07-29T05:02:28+08:00 所有这些 find 调用都非常好,但是当我赶时间时,我很少记得确切所需的命名法:而是使用 ls。正如有人提到的, ls 。会工作,但我更喜欢 ls -1 如下: ls -1 | xargs -n 100 rm -rf -n xxx 数字非常安全,因为超过最大值将被自动更正(如果超过 size-max;请参阅 -s )或者如果超过应用程序的 args-max 它通常会相当明显的。 应该注意,当您只想删除大目录中的文件子集并且出于任何原因不想使用 find 时,将 grep 插入此链的中间很方便。 这个答案假设您正在为您的 ls、xargs 等使用 Gnu 核心实用程序。 Amandasaurus 2009-07-29T00:30:22+08:002009-07-29T00:30:22+08:00 您可以使用该-exec +选项来查找哪个会尝试运行 rm 尽可能少的次数,哪个可能会更快。 find . -type f -exec rm '{}' + Hubert Kario 2012-04-27T08:15:56+08:002012-04-27T08:15:56+08:00 这是在系统需要保持响应时删除大量文件的版本。 它通过小批量发布工作(默认为 100 个文件)并等待其他工作完成来工作。 从 ext3 上的单个目录中删除超过 50 万个文件非常出色。它打印完成的百分比作为一点奖励 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 kilcode 2017-02-17T01:53:11+08:002017-02-17T01:53:11+08:00 解决“参数太长”或“无法分配内存”错误 这对会话文件夹中的220,000 多个文件起到了作用.... 优点:立即开始删除文件 cd 路径/到/文件夹 ls -f | xargs rm -f -v 单击以获取正在删除的文件的屏幕截图- (在 ~ 15 分钟内删除了所有文件) -f (在 ls 之后)不进行预排序 -v (在 rm 之后)将每个文件显示为被删除 -f (在 rm 之后)强制通过,不提示写保护文件 提示:首先重命名文件夹(前会话为 session_old)以防止在您尝试删除文件时添加其他自动生成的文件。如果它不像我的情况那样自动,您可以手动重新制作原始目录
它只需要太长时间(每个文件一个 rm 执行)。
这个效率更高:
因为它需要尽可能多的文件名作为 rm 的参数,然后在下一次加载文件名时运行 rm ......可能会发生 rm 只被调用 2 或 3 次。
如果您无法删除目录,您可以随时使用 find。
这将删除当前目录中的所有文件,并且只删除当前目录(不是子目录)。
这两个都可以解决问题。这里对每种技术的各自性能进行了分析。
或者
问题源于 bash 用目录中的每个项目扩展“*”。这两种解决方案都依次处理每个文件。
我可以通过备份一个级别来做到这一点:
cd ..
并运行:
rm directory name -rf
然后重新创建目录。
所有这些 find 调用都非常好,但是当我赶时间时,我很少记得确切所需的命名法:而是使用 ls。正如有人提到的, ls 。会工作,但我更喜欢 ls -1 如下:
ls -1 | xargs -n 100 rm -rf
-n xxx 数字非常安全,因为超过最大值将被自动更正(如果超过 size-max;请参阅 -s )或者如果超过应用程序的 args-max 它通常会相当明显的。
应该注意,当您只想删除大目录中的文件子集并且出于任何原因不想使用 find 时,将 grep 插入此链的中间很方便。
这个答案假设您正在为您的 ls、xargs 等使用 Gnu 核心实用程序。
您可以使用该
-exec +
选项来查找哪个会尝试运行 rm 尽可能少的次数,哪个可能会更快。这是在系统需要保持响应时删除大量文件的版本。
它通过小批量发布工作(默认为 100 个文件)并等待其他工作完成来工作。
从 ext3 上的单个目录中删除超过 50 万个文件非常出色。它打印完成的百分比作为一点奖励
解决“参数太长”或“无法分配内存”错误
这对会话文件夹中的220,000 多个文件起到了作用....
优点:立即开始删除文件
单击以获取正在删除的文件的屏幕截图- (在 ~ 15 分钟内删除了所有文件)
-f (在 ls 之后)不进行预排序
-v (在 rm 之后)将每个文件显示为被删除
-f (在 rm 之后)强制通过,不提示写保护文件
提示:首先重命名文件夹(前会话为 session_old)以防止在您尝试删除文件时添加其他自动生成的文件。如果它不像我的情况那样自动,您可以手动重新制作原始目录