dirname 似乎不适用于 xargs

dav*_*ers 7 osx xargs dirname

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

$ printf '%s\n' foo/index.js bar/index.js baz/index.js | xargs basename
index.js
index.js
index.js
Run Code Online (Sandbox Code Playgroud)

xargs并且dirname,虽然似乎没有一起工作:

$ printf '%s\n' foo/index.js bar/index.js baz/index.js | xargs dirname
usage: dirname path
Run Code Online (Sandbox Code Playgroud)

我希望

foo
bar
baz
Run Code Online (Sandbox Code Playgroud)

作为输出。我错过了什么?

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

Kus*_*nda 10

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

$ basename some/file e
fil
Run Code Online (Sandbox Code Playgroud)

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

printf '%s\n' some arguments | xargs -I {} basename {}
Run Code Online (Sandbox Code Playgroud)

或者,

printf '%s\n' some arguments | xargs -I {} dirname {}
Run Code Online (Sandbox Code Playgroud)

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

  • 我从根本上误解了 `xargs`。我的印象是它的默认行为是*为每个*输入行执行一次该实用程序。感谢您纠正我的理解。 (4认同)