这个问题是一个合乎逻辑的延续我怎样才能删除目录中的所有文件,当它报告“参数列表太长”
我有
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
我能做些什么来删除这个目录?
这听起来像是一个find
问题。 我注意到一些错误报告,指出GNU findutils特定版本的错误。
你可以尝试用“ls”和“grep”代替“find”。 像这样的东西:
cd somedir \ls -f | grep "something" | xargs -d "\n" rm
\ls
上的反斜杠代替ls
告诉bash忽略任何会影响输出格式的别名。 如果您忘记了反斜杠技巧,您也可以说/bin/ls
。 -f
选项告诉它禁用sorting(这可以节省时间/内存)并包含隐藏的文件。 xargs的-d "\n"
参数告诉它在换行而不是空格上分割。 请注意,所有版本的xargs都不支持-d
,这是一个耻辱。
请注意, ls something*
将不起作用,因为something*
是在bash中扩展而不是由ls扩展,并且会导致“参数列表太长”的错误。 这就是为什么你通过greppipe理结果。
pipe道通过头部find结果似乎为我工作(我有一个类似的问题,从6个摄像头的安全摄像头镜头上传一次)
find . -type f | head -1000 | xargs rm
如果是这样,循环它:
for i in {1..999} do find . -type f | head -1000 | xargs rm done
将999换成有多less个文件(如果你知道的话)。
尝试使用ls
而不是find( ls -1 | xargs rm
)。
要么
在ls
的输出上使用for循环
#!/bin/sh for i in `ls -1`; do rm $i done
(在这两种情况下,如果你仍然有困难的壳可能会触及记忆天花板:尝试通过head
pipe道来缩短列表)
要么
写在Perl / C /等。 (循环访问readdir
的输出和垃圾回收)
…可能会有更多的“或”情况,但这些情况马上就会浮现出来。
我想知道什么是最新版本的rsync将做一个空目录作为源和 – --delete
选项…
find . -type f -print | awk '{ print "rm \"" $1 "\""} | sh
运行rm作为find命令的一部分。 不需要pipe道/ xargs /幻想打印。
找 。 -exec rm -f {} +