0

我正在尝试删除所有超过 2 天的空文件。我也忽略了隐藏文件,从点开始。我正在使用以下代码进行操作:

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

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

操作系统是 Solaris。

4

1 回答 1

1

选项1

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

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

-print(请注意,我从您的选项中删除了(我认为是)一个流浪者find。显示的选项删除了 2 天前修改的空文件,其中名称不以 a 开头.,这是您的原始文件grep似乎处理的情况。 )

选项 2

问题主要xargs是定义为在空格处拆分其输入。另一种方法是编写您自己的xargs代理项,该代理项的行为在名称中带有空格;我已经做到了。然后,只有文件名包含换行符(文件系统允许)时,您才会遇到问题。使用 NUL ( '\0') 终止符可以保证安全;它是唯一不能出现在路径名中的字符(这就是 GNU 选择将它与-print0etc 一起使用的原因)。

选项 3

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

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确实支持+标记,因此不需要使用-print0andxargs -0变通方法。

于 2012-10-17T07:19:40.320 回答