サブディレクトリにあるファイルの数を確認して、すべてのiノードの使用がシステムのどこにあるかを確認します。スペース使用のためにこれをやるようなもの
du -sh /*
これにより、ルート以外のディレクトリで使用されるスペースが得られますが、この場合はサイズではなくファイル数が必要です。
find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
安全性/互換性の修正について、Gillesとxenoterracideに感謝します。
最初の部分:find -maxdepth 1 -type d
は、現在の作業ディレクトリ内のすべてのディレクトリのリストを返します。これはパイプされています...
2番目の部分:while read -r dir; do
は、whileループを開始します-whileに入ってくるパイプが開いている限り(つまり、ディレクトリのリスト全体が送信されるまで)、readコマンドは次の行を変数 " dir」。それが続く...
3番目の部分:printf "%s:\t" "$dir";
は、文字列を "$ dir"(ディレクトリ名の1つを保持しています)に出力し、その後にタブを出力します。
4番目の部分:find "$dir -f file"
は、「$ dir」に保持されているディレクトリ名内のすべてのファイルのリストを作成します。このリストはに送信されます。
5番目の部分:wc -l;
は、標準入力に送信される行数をカウントします。
最後の部分:done
は、whileループを単に終了します。
したがって、現在のディレクトリ内のすべてのディレクトリのリストを取得します。これらの各ディレクトリについて、wc -l
を使用してすべてをカウントできるように、その中のすべてのファイルのリストを生成します。結果は次のようになります。
./dir1: 234
./dir2: 11
./dir3: 2199
...
find . -type f | wc -l
を試してください。現在のディレクトリにあるすべてのファイルとサブディレクトリにあるすべてのファイルの数がカウントされます。すべてのディレクトリはファイルとしてカウントされず、通常のファイルのみがカウントされることに注意してください。
以下は、いくつかの便利なリストコマンドのコンパイルです(以前のユーザーコードに基づいて再ハッシュされています)。
フォルダをファイル数でリスト:
find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); printf "%4d : %s\n" $n "$dir"; done
ファイルカウントがゼロ以外のフォルダをリスト:
find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done
サブフォルダーの数でフォルダーをリスト:
find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; printf "%4d : %s\n" $n "$dir"; done
サブフォルダー数がゼロ以外のフォルダーをリスト:
find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done
空のフォルダをリスト:
find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -eq 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done
コンテンツ数のある空でないフォルダをリスト:
find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done
試してください:
find /path/to/start/at -type f -print | wc -l
開始点として、または本当にディレクトリのサブディレクトリだけを再帰的に処理したい場合(およびその最上位ディレクトリのファイルをスキップする場合)
find `find /path/to/start/at -mindepth 1 -maxdepth 1 -type d -print` -type f -print | wc -l
次のソリューションは、現在のディレクトリから始まる実際の使用済みiノードの数をカウントします。
find . -print0 | xargs -0 -n 1 ls -id | cut -d' ' -f1 | sort -u | wc -l
同じサブセットのファイル数を取得するには、次を使用します。
find . | wc -l
現在のディレクトリのファイルを考慮せずにサブディレクトリのみを探索するソリューションについては、他の回答を参照できます。
OS X 10.6はfind
のパスを指定していないため、受け入れられた回答のコマンドでチョークが表示されます。代わりに以下を使用してください:
find . -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
私はパーティーに遅れていることを知っていますが、この純粋なbash
(またはダブルスターグロブを受け入れる他のシェル)ソリューションは、状況によってははるかに高速になると思います。
shopt -s globstar # to enable ** glob in bash
for dir in */; do a=( "$dir"/**/* ); printf "%s\t%s\n" "$dir:" "${#a[*]}"; done
出力:
d1/: 302
d2/: 24
d3/: 640
...
これを試してみてください:
find -type d -print0 | xargs -0 -I {} sh -c 'printf "%s\t%s\n" "$(find "{}" -maxdepth 1 -type f | wc -l)" "{}"'
ファイル名に改行が含まれていない限り、問題なく動作するはずです。
なぜ誰も(私も含めて)誰も気づかなかったのかわかりません。
du --inodes
--inodes
list inode usage information instead of block usage
これでOPの問題が解決すると確信しています。私はそれをたくさん使って、私の巨大なドライブのすべてのジャンクがどこにあるかを見つけ出しました(そしてそれを古いディスクにオフロードしました)。
再帰したくない場合(これは他の状況で役立ちます)、追加します
-S, --separate-dirs
ncdu
をインストールしている場合(いくつかのクリーンアップを行うには必須)、単にc
と入力して「子アイテム数の表示を切り替えます」。そしてC
を「アイテムで並べ替え」に。