这个问题是当报告“参数列表太长”时,如何从目录中删除所有文件
我有
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\ls
则ls
告诉 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