如何转义文件输出以实现与‘xargs’的兼容性?

如何转义文件输出以实现与‘xargs’的兼容性?

我有这个命令:

find $1 | xargs touch

但是'名称中带有字符的文件会失败,并出现“xargs:不匹配的单引号”,我猜其他特殊字符也会导致同样的问题。

我如何才能摆脱输出,以便该命令适用于所有文件名?

答案1

find $1 -print0 | xargs -0 touch

这会以 \000(字符 0)终止每个文件名,并指示 xargs 期望文件名以 \000 终止

   -print0
          True; print the full file name on the standard output,  followed
          by  a  null  character  (instead  of  the newline character that
          -print uses).  This allows file names that contain  newlines  or
          other  types  of white space to be correctly interpreted by pro‐
          grams that process the find output.  This option corresponds  to
          the -0 option of xargs.

答案2

以下是更简单、更快捷、最便携的方法:

find $1 -exec touch {} +

注意+结尾语法。与更流行的\; exec结尾语法不同,+它以相同的方式打包参数xargs

与通常建议的解决方案相比find ... | xargs ...,这个find唯一的解决方案更有效,因为:

  • 单个进程处理整个任务
  • 不涉及数据管道
  • 不需要与“\0” hack 相关的额外处理。

由于它符合 POSIX 标准,因此它还可以与大多数(如果不是全部)当前find实现兼容find -print0,而xargs -0与和都属于 GNUisms。

答案3

如果您的输入不是来自find,而是来自其他行生成程序,您可能需要看看 GNU Parallel,它可以很好地处理包含 ' " 和空格的文件名:

find | parallel touch

观看介绍视频以了解更多信息:第 1 部分:GNU Parallel 脚本处理和执行

相关内容