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

这个问题是一个合乎逻辑的延续我怎样才能删除目录中的所有文件,当它报告“参数列表太长”

我有

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 

(在这两种情况下,如果你仍然有困难的壳可能会触及记忆天花板:尝试通过headpipe道来缩短列表)

要么

写在Perl / C /等。 (循环访问readdir的输出和垃圾回收)

…可能会有更多的“或”情况,但这些情况马上就会浮现出来。

我想知道什么是最新版本的rsync将做一个空目录作为源和 – --delete选项…

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

运行rm作为find命令的一部分。 不需要pipe道/ xargs /幻想打印。

找 。 -exec rm -f {} +