使用GNU find
,将结果传递给xargs
非常容易。以下是一个典型(无用)的示例:
find /var/log -name "*.log" | xargs dirname
这个命令会返回所有包含日志文件的目录名称。
使用BSD find
的相同命令不起作用,最终出现以下错误:
usage: dirname path
这是因为
xargs
无法将文件列表条目传递给dirname
。BSD的
find
手册提到了-exec
和-execdir
选项,指出“此行为类似于xargs(1)”。引用块:
-exec utility [argument ...] {} + 与-exec相同,只是“{}”被尽可能多的路径替换以调用utility。此行为类似于xargs(1)。
-execdir utility [argument ...] {} + 与-execdir相同,只是“{}”被尽可能多的路径替换以调用utility。此行为类似于xargs(1)。
每次我回归这两个标志时,我都必须再次阅读文档。我似乎无法记住它们的用法!此外,我关注脚本在GNU / BSD系统之间的便携性,基本上是Linux,Open / FreeBSD和MacOS。有没有办法将BSD的
find
管道传递到xargs
,或者说-exec
是唯一的选择?
xargs
会导致那个错误吗?我刚刚在将echo
的输出导入到xargs dirname
时遇到了这个问题。奇怪的是,使用args basename
却可以正常工作。 - Noel Yapecho
输入的行被处理为一行。 - Noel Yap