「find -exec du」が機能しないのはなぜですか?

「find -exec du」が機能しないのはなぜですか?

"."で始まるブランチを除いて、ディレクトリツリーのディスク使用量を取得したいと思うので、最終的にsshを介して実行したいので、パイプを使用しないことをお勧めします。次のコマンドを実行すると、すべてのディレクトリのリストが表示されます。

> /bin/find . \( -name .[^.]\* -prune \) -o \( -type d -exec /bin/echo -sh {} + \)
-sh ./dir-1 ./dir-2 ./dir-3 [...]

duを単独で実行すると、期待される結果が得られます。

> /bin/du -sh ./dir-1 ./dir-2 ./dir3 [...]
11M     ./dir-1
254K    ./dir-2
15M     ./dir-3
[...]

2つを組み合わせると、行全体が得られます。

> /bin/find . \( -name .[^.]\* -prune \) -o \( -type d -exec /bin/du -sh {} + \)
1.4G    .

しかし、私はOracle Linux Serverバージョン7.9とGNU bash、バージョン4.2.46(2)-リリース(x86_64-redhat-linux-gnu)を実行しています。

ベストアンサー1

要約すると、duディレクトリは一度だけ計算されます。

du -sh . somedir

占有されている.ため表示されます。順序が重要なのでsomedir.

du -sh somedir .

somedirと同時に表示され、計算され.ません。somedir.

あなたのfindコマンドは最終的に含まれ.、これが最初に出てくるので、これが表示されます。最小深さを指定すると、これを防ぐことができます。これにより、現在のディレクトリの下にあるすべてのディレクトリの完全な内容が表示されます。

それが欲しいなら、それで

du -sh */

を使用せずに同じ結果を得ることができますfind

詳細なディレクトリ固有の出力が必要な場合は、findディレクトリに深さ優先リストを指示する必要があります。-pruneこれは機能しませんが、パスフィルタリングは次のとおりです。

find . -mindepth 1 -depth -type d \! -path '*/.*' -exec du -sh {} +

(隠しディレクトリのサイズは、まだ隠されていない親ディレクトリのサイズに含まれています。)

duこれをサポートしている場合は、--excludeそれを使用して同じ効果を得ることができます。

du -h --exclude '*/.*' ./

おすすめ記事