我有这个命令:
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 脚本处理和执行