这个问题是报告“参数列表太长”时如何从目录中删除所有文件的逻辑延续
我有
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
我该怎么做才能删除这个目录?
通过头部管道查找结果似乎对我有用(我有一个类似的问题,即每分钟上传一次来自 6 个摄像头的安全摄像头镜头)
如果是,则循环它:
将 999 替换为那里有多少个文件(如果你知道的话)。
这听起来像一个问题
find
。我注意到一些关于人们在使用特定版本的 GNU findutils 时遇到该错误的错误报告。您可以尝试将“find”替换为“ls”和“grep”。像这样的东西:
\ls
相反,反斜杠ls
告诉 bash 忽略任何会影响输出格式的别名。你也可以说/bin/ls
如果你忘记了反斜杠把戏。该-f
选项告诉它禁用排序(这可以节省时间/内存)并包含隐藏文件。xargs的-d "\n"
参数告诉它在换行符而不是空格上拆分。请注意,-d
并非所有版本的 xargs 都支持这一点,这很遗憾。请注意,这是
ls something*
行不通的,因为它something*
是在 bash 中扩展的,而不是由 ls 扩展的,并且会导致“参数列表太长”错误。这就是您通过 grep 管道传输结果的原因。尝试使用
ls
而不是 find (ls -1 | xargs rm
)。或者
在输出上使用 for 循环
ls
(在这两种情况下,如果您仍然遇到问题,shell 可能会达到内存上限:尝试
ls
通过管道head
缩短列表)或者
写在 perl/C/etc 中。(迭代
readdir
的输出和垃圾收集,你去)...可能还有更多“或”案例,但这些案例立即浮现在脑海中。
我想知道最新版本的 rsync 将空目录作为源和
--delete
选项做什么......只需将 rm 作为 find 命令的一部分运行。不需要管道/xargs/花式打印。
寻找 。-exec rm -f {} +