
ワイルドカードを含むファイルとディレクトリのリストを含むファイルがあります*
。エントリのサイズを出力して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)"}
これは、file
1 行につき 1 つの glob パターンがあることを前提とし、(f)
拡張フラグを使用して入力を行に分割します。パターンとファイル名の両方にスペースを含めることができます。GLOB_SUBST
拡張 ( ${~...}
) はzsh
、入力内のワイルドカードを処理するように指示します。
パターンが空白で区切られているだけの場合は、(f)
フラグは必要ありません。
setopt nullglob
du -hsc ${~$(<file)}
これはNULL_GLOB
オプションを設定します。 glob パターンのいずれかに一致するファイルがない場合、この設定が必要になります。