web-dev-qa-db-ja.com

dirnameがxargsで機能しないようです

xargsbasenameは期待どおりに連携します。

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

ただし、xargsdirnameは連動していないようです。

$ 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)を使用しています。

4
davidchambers

macOSのdirnameは単一のパス名のみを使用しますが、basenameは複数のパス名を使用できます。ただし、次のように最初のパスの最後から2番目のパス名を誤って削除しないように、単一のパス名で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 {}を使用することもできます。

8
Kusalananda

dirname 引数は1つだけです。 GNU/coreutilsバージョンのdirnameは複数の引数を取ることができますが、これは非標準の拡張です。

SYNOPSIS

    dirname string
2
Uncle Billy