dirname 似乎不适用于 xargs

dirname 似乎不适用于 xargs

xargsbasename按照我的预期一起工作:

$ printf '%s\n' foo/index.js bar/index.js baz/index.js | xargs basename
index.js
index.js
index.js

xargs不过,和dirname似乎不能一起工作:

$ printf '%s\n' foo/index.js bar/index.js baz/index.js | xargs dirname
usage: dirname path

我希望

foo
bar
baz

作为输出。我缺少什么?

我使用的是 Darwin 18.2.0 (macOS 10.14.3)。

答案1

dirname在 macOS 上仅采用单个路径名,而basename能够使用多个路径名。然而,使用单个路径名调用是最安全的basename,这样它就不会意外地尝试从第一个路径名的末尾删除第二个路径名,如下所示

$ basename some/file e
fil

当调用这些实用程序时,xargs您可能会要求xargs一次使用一个换行符分隔的字符串运行该实用程序:

printf '%s\n' some arguments | xargs -I {} basename {}

或者,

printf '%s\n' some arguments | xargs -I {} dirname {}

您也可以使用xargs -L 1 utility而不是xargs -I {} utility {}.

答案2

dirname仅需要 1 个参数;虽然 GNU/coreutils 版本dirname可以接受多个参数,但这是一个非标准扩展:

SYNOPSIS

    dirname string

相关内容