我正在尝试删除所有超过2天的空文件。此外,我忽略隐藏文件,从点开始。我正在使用这段代码:
find /u01/ -type f -size 0 -print -mtime +2 | grep -v "/\\." | xargs rm
直到文件名中有空格才能正常工作。我怎么能让我的代码忽略它们?
操作系统是Solaris。
答案 0 :(得分:1)
将GNU find
和GNU xargs
安装在适当的位置(不是/usr/bin
)并使用:
find /u01/ -type f -size 0 -mtime +2 -name '[!.]*' -print0 | xargs -0 rm
(请注意,我从您的-print
选项中删除了(我认为是)流浪find
。显示的选项会删除超过2天前修改的空文件,其中名称不是以.
,这是原始grep
似乎要处理的条件。)
问题主要是xargs
被定义为在空格处分割其输入。另一种方法是编写自己的xargs
代理,其行为明确,名称中包含空格;我做到了。如果文件名包含换行符(文件系统允许的话),则只会遇到问题。使用NUL('\0'
)终结器可确保安全;它是唯一不能出现在路径名中的字符(这就是为什么GNU选择将它与-print0
等一起使用)。
最后一个更好的选择可能是:
find /u01/ -type f -size 0 -mtime +2 -name '[!.]*' -exec rm {} \;
这样可以避免使用xargs
并正确处理所有文件名(路径名) - 代价是对找到的每个文件执行一次rm
。如果你每次运行时只处理几个文件,那就不会太痛苦了。
POSIX 2008引入符号+
代替\;
,然后表现得更像xargs
,收集尽可能多的参数,方便地适合它为命令行分配的空间在运行命令之前:
find /u01/ -type f -size 0 -mtime +2 -name '[!.]*' -exec rm {} +
我所使用的Solaris版本不支持这种表示法,但我知道我使用的是古老版本的Solaris。 GNU find
支持+
标记,因此无需使用-print0
和xargs -0
解决方法。