从目录中删除文件:内存耗尽

从目录中删除文件:内存耗尽

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

我有

drwxr-xr-x  2 doreshkin doreshkin 198291456 Apr  6 21:35 session_data

我试过

find session_data -type f -delete
find session_data -type f | xargs rm -f
find session_data -maxdepth 1 -type f -print0 | xargs -r0 rm -f

结果是一样的:

find: memory exhausted

我该怎么做才能删除该目录?

答案1

这听起来像是 的问题find。我注意到一些人在使用特定版本的 GNU findutils 时遇到了该错误。

您可以尝试用“ls”和“grep”替换“find”。如下所示:

cd somedir
\ls -f | grep "something" | xargs -d "\n" rm

反斜杠 on\lsls告诉 bash 忽略会影响输出格式的任何别名。/bin/ls如果您忘记了反斜杠技巧,也可以说。该-f选项告诉它禁用排序(这可以节省时间/内存)并包含隐藏文件。xargs-d "\n"的参数告诉它按换行符而不是空格进行拆分。请注意,并非-d所有版本的 xargs 都支持此功能,这很遗憾。

请注意,这ls something*不起作用,因为是something*在 bash 中展开的,而不是通过 ls 展开的,并且会导致“参数列表太长”错误。这就是为什么您要通过 grep 管道传输结果。

答案2

通过 head 管道查找结果对我来说似乎有效(我有一个类似的问题,6 个摄像头的安全摄像头拍摄的照片每分钟上传一次)

find . -type f | head -1000 | xargs rm

如果是,则循环执行:

for i in {1..999}
do
   find . -type f | head -1000 | xargs rm
done

将 999 替换为其中有多少个千个文件(如果您知道)。

答案3

尝试使用ls而不是 find( ls -1 | xargs rm)。

或者

使用 for 循环遍历输出ls

#!/bin/sh
for i in `ls -1`; do
  rm $i
done

(在这两种情况下,如果您仍然遇到问题,则 shell 可能达到了内存上限:尝试ls通过管道head缩短列表)

或者

用 perl/C/etc 编写(迭代readdir输出并在进行过程中进行垃圾收集)

...可能还有更多“或”的情况,但这些立即浮现在我的脑海中。

答案4

find . -type f -print | awk '{ print "rm \"" $1 "\""} | sh

相关内容