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