忽略Solaris“find”输出中的空格

时间:2012-10-17 07:03:26

标签: bash find spaces sunos

我正在尝试删除所有超过2天的空文件。此外,我忽略隐藏文件,从点开始。我正在使用这段代码:

find /u01/ -type f -size 0 -print -mtime +2 | grep -v "/\\." | xargs rm

直到文件名中有空格才能正常工作。我怎么能让我的代码忽略它们?

操作系统是Solaris。

1 个答案:

答案 0 :(得分:1)

选项1

将GNU find和GNU xargs安装在适当的位置(不是/usr/bin)并使用:

find /u01/ -type f -size 0 -mtime +2 -name '[!.]*' -print0 | xargs -0 rm

(请注意,我从您的-print选项中删除了(我认为是)流浪find。显示的选项会删除超过2天前修改的空文件,其中名称不是以.,这是原始grep似乎要处理的条件。)

选项2

问题主要是xargs被定义为在空格处分割其输入。另一种方法是编写自己的xargs代理,其行为明确,名称中包含空格;我做到了。如果文件名包含换行符(文件系统允许的话),则只会遇到问题。使用NUL('\0')终结器可确保安全;它是唯一不能出现在路径名中的字符(这就是为什么GNU选择将它与-print0等一起使用)。

选项3

最后一个更好的选择可能是:

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支持+标记,因此无需使用-print0xargs -0解决方法。