web-dev-qa-db-ja.com

duへのファイルとディレクトリのパイピングリストには、ディレクトリのサイズのみが表示されますか?

複数のサブディレクトリを持つディレクトリがあり、それぞれにいくつかのファイルが含まれているとします。

1/a.txt
1/b.txt
2/c.txt
2/d.txt
3/e.txt
3/f.txt

各ファイルのサイズを確認したい。これを行うには、du -aのように、より簡単で直接的な方法があることを覚えておいてください。教育目的で、以下が機能しない理由を知りたいだけです。


私の無意味な運動

find .を実行すると、すべてのファイルとディレクトリのリストが返されるので、次のようにパイプしてみました。

find . | xargs du

しかし、それはディレクトリ1、2、および3のサイズを返すだけです。私の頭の中でxargsfindからの出力の各行をマッピングする必要があるため、少し理解できませんduの呼び出し。


代わりに私が使用する場合:

find . | xargs du -a

その後、期待どおりに動作し、すべてのファイルとディレクトリのサイズが一覧表示されます。 -type fオプションを使用してファイルのリストを渡すだけでも問題なく機能するので、ファイルが混在するディレクトリのリストを受け取ることと関係があります。

何が起きてる?

4
philraj

何が起こっているのかというと、xargsはすべての名前を1つのコマンドラインに(できれば)配置するため、duに渡されたコマンドは1つだけです。次に、duはファイル名を無視します(ご想像のとおり、ファイルはディレクトリの一部であり、2回カウントされません)。

-n 1パラメータをxargsに使用すると、コマンドが分割され、期待したとおりに表示されます。

find . | xargs -n 1 du -a

7
Thomas Dickey

以下のコマンドを使用できます

  find path -type f -printf "%s %p\n"
0