xargs
并basename
按照我的预期一起工作:
$ 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