拡張された入力行すべてに対して xargs ユーティリティを実行するにはどうすればよいでしょうか?

拡張された入力行すべてに対して xargs ユーティリティを実行するにはどうすればよいでしょうか?

ワイルドカードを含むファイルとディレクトリのリストを含むファイルがあります*。エントリのサイズを出力してdu合計を出したいと考えています。

まず次のように始めます:

cat file | xargs du -hs

ワイルドカード*は展開されません。展開するには、次のようにします。

cat file | xargs -I@ sh -c 'du -hs @'

しかし、試してみると:

cat file | xargs -I@ sh -c 'du -hsc @'

合計するとそれぞれファイルの(拡張)エントリ。ファイルは次のようになります。

foo*
bar*

私は取得します:

1K foo1
1K foo2
2K total
1K bar1
1K bar2
2K total

ファイル内のすべてのエントリの合計を取得するにはどうすればよいですか?duすべての行に対して1回だけ実行するにはどうすればよいですか? ありがとうございます

答え1

cat file | xargs -I@ sh -c 'echo @' | xargs du -hsc

答え2

xargs が必須でない場合は、次のようにして合計も生成されますdu

du -hsc ${(f)~"$(<file)"}

これは、file1 行につき 1 つの glob パターンがあることを前提とし、(f)拡張フラグを使用して入力を行に分割します。パターンとファイル名の両方にスペースを含めることができます。GLOB_SUBST拡張 ( ${~...}) はzsh、入力内のワイルドカードを処理するように指示します。

パターンが空白で区切られているだけの場合は、(f)フラグは必要ありません。

setopt nullglob
du -hsc ${~$(<file)}

これはNULL_GLOBオプションを設定します。 glob パターンのいずれかに一致するファイルがない場合、この設定が必要になります。

関連情報