"."で始まるブランチを除いて、ディレクトリツリーのディスク使用量を取得したいと思うので、最終的に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 '*/.*' ./