判断从GNU findutils 更改日志它必须在 GNU 中存在至少十年(也比它作为 POSIX 的一部分的时间还要长),所以现在可以安全地假设它在所有地方都受到支持吗?
另外,在可以使用的xargs
情况下,是否有任何充分的理由来提倡替代? (显然,如果您需要一些特殊参数,例如用于控制最大参数数、并行性等的参数,-exec … +
您会使用这些参数)xargs
有趣的引用来自GNU findutil 文档的一部分:
[查找与
-exec … +
]可能比 的某些用途效率低xargs
;例如,xargs
允许在上一个命令仍在执行的同时构建新的命令行,并允许您指定多个要并行运行的命令。然而,该find ... -exec ... +
结构具有广泛的可移植性的优点。 GNU findutils-exec ... +
直到版本 4.2.12 才支持 ' '[2005 年 1 月];原因之一是-print0
无论如何它已经有了“ ”动作。
答案1
+
的变体是-exec
在 POSIX 中引入的,PASC 解释 1003.2 #2102001 年,并在第 6 期中与 POSIX 标准合并(如当前标准中所述)find(1)
文档)。根据解释,System V Release 4 的所有衍生版本都支持它,HP-UX 也是如此(2001 年 - 我知道 HP-UX 10 不支持它);显然任何符合 POSIX 6 或 7 标准的系统也支持它。
GNU-ism 实际上是find -print0 | xargs -0
一组命令。如果-exec ... +
可用,但不-0
提供支持xargs
,那么您最好使用前者;即使如果它支持您的需要,也-0
没有理由不使用。-exec ... +
答案2
现在可以安全地假设 [
-exec ...
] 在所有地方都受到支持吗?
该-exec ... '{}' ';'
变体为每个执行的命令提供精确的匹配,现在肯定会在所有地方得到支持,甚至在非 POSIX unix 系统上也是如此。
变-exec ... '{}' +
体,我不确定。确实,它的定义是POSIX-1,所以当前所有 POSIXy 系统肯定都支持它。但是,我不确定是否所有较旧的 UNIX 系统(仍在使用)都支持它。
-exec ... '{}' +
在可以使用[ ] 的情况下,是否有任何充分的理由提倡使用 xargs ?
不,不是真的。既然一个命令就足够了,为什么还要使用两个命令呢?
问题更在于,如果你唯一知道的工具是锤子,那么所有问题看起来都像钉子。的强大之处在于,在执行作用于列表的命令之前,您可以使用 、 、 等操作匹配xargs
列表。bash
sed
awk
(实际上,这要求文件和目录名称中不嵌入换行符。Bash 和 GNU find、sed、awk 和 xargs 都支持 nul 字符\0
作为分隔符,因此它们可以操作所有可能的文件名,而无需问题。)