gpt4 book ai didi

shell - 如何在 BSD 查找中使用 xargs?

转载 作者:行者123 更新时间:2023-12-03 23:53:36 25 4
gpt4 key购买 nike

使用 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 ...] {} + Same as -exec, except that ``{}'' is replaced with as many pathnames as possible for each invocation of utility. This behaviour is similar to that of xargs(1).

-execdir utility [argument ...] {} + Same as -execdir, except that ``{}'' is replaced with as many pathnames as possible for each invocation of utility. This behaviour is similar to that of xargs(1).



每次我回到这两个标志上时,我都必须再次阅读文档。我似乎无法记住它们的用法!此外,我还关心跨 GNU/BSD 系统(基本上是 Linux、Open/FreeBSD 和 MacOS)的脚本可移植性。

任何管道 BSD findxargs , 或 -exec真的是唯一的选择吗?

最佳答案

xargs 的 GNU 和 FreeBSD 版本支持将字符串从 stdin 传递给命令的方法,作为 -I 的一部分旗帜。所有你需要的是

find /var/log -name "*.log" | xargs -I {} dirname -- "{}"

GNU xargs页面说国旗为

-I replace-str Replace occurrences of replace-str in the initial-arguments with names read from standard input.



这提供了一种替代方法,而不是使用 -exec-execdir .但是,话虽如此,使用 -exec对你的情况来说不是太复杂。
find /var/log -name "*.log" -type f -exec dirname "{}" \;

关于shell - 如何在 BSD 查找中使用 xargs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53492200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com