複数のサブディレクトリを持つディレクトリがあり、それぞれにいくつかのファイルが含まれているとします。
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のサイズを返すだけです。私の頭の中でxargs
はfind
からの出力の各行をマッピングする必要があるため、少し理解できませんdu
の呼び出し。
代わりに私が使用する場合:
find . | xargs du -a
その後、期待どおりに動作し、すべてのファイルとディレクトリのサイズが一覧表示されます。 -type f
オプションを使用してファイルのリストを渡すだけでも問題なく機能するので、ファイルが混在するディレクトリのリストを受け取ることと関係があります。
何が起きてる?
何が起こっているのかというと、xargs
はすべての名前を1つのコマンドラインに(できれば)配置するため、du
に渡されたコマンドは1つだけです。次に、du
はファイル名を無視します(ご想像のとおり、ファイルはディレクトリの一部であり、2回カウントされません)。
-n 1
パラメータをxargs
に使用すると、コマンドが分割され、期待したとおりに表示されます。
find . | xargs -n 1 du -a
以下のコマンドを使用できます
find path -type f -printf "%s %p\n"