【问题标题】:Ignore spaces in Solaris 'find' output忽略 Solaris“查找”输出中的空格
【发布时间】:2012-10-17 07:03:26
【问题描述】:

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

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

在文件名中有空格之前它可以正常工作。我怎样才能让我的代码忽略它们?

操作系统是 Solaris。

【问题讨论】:

  • 你需要-print吗?如果包含它,我希望它位于条件的末尾,而不是中间。
  • 不,那是错误的。

标签: bash find spaces sunos


【解决方案1】:

选项 1

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

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

(请注意,我从您的 find 选项中删除了(我认为是)一个流浪的 -print。显示的选项删除了 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 解决方法。

【讨论】:

  • 谢谢你,find /u01/ -type f -size 0 -mtime +2 -name '[!.]*' -exec rm {} \; 这对我有用。
猜你喜欢
  • 2015-02-18
  • 1970-01-01
  • 2011-02-12
  • 2021-12-03
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多