サブディレクトリにあるファイルの数を確認して、すべてのiノードの使用がシステム上のどこにあるかを調べたいと思います。私はスペース使用量のためにこれをするようなもの
du -sh /*
これにより、ルート以外のディレクトリで使用されるスペースが得られますが、この場合、サイズではなくファイル数が必要です。
du -sh /*
どのようにカウントを機能させたいかをかなり明確にしたと思いました。同じこと、バイトではなくファイルを数えるだけです。
サブディレクトリにあるファイルの数を確認して、すべてのiノードの使用がシステム上のどこにあるかを調べたいと思います。私はスペース使用量のためにこれをするようなもの
du -sh /*
これにより、ルート以外のディレクトリで使用されるスペースが得られますが、この場合、サイズではなくファイル数が必要です。
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
...
read -r
プレーンread
スラッシュとして特別にバックスラッシュを使用します。その後、echo -en "$dir:\t"
バックスラッシュを再びマングルします。単純な修正はprintf '%s:\t' "$dir"
代わりに使用することです。次に、する$dir
必要があります"$dir"
(常に変数置換の周りに二重引用符を使用します)。
find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" | wc -l; done
sort -n -r -k2
ほとんどの使い方がどこにあるか私が知っているように、ディレクトリの多くのために、このの終わりに
-type f
してファイルをリストするのを忘れた:find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
いくつかの便利なリストコマンドのコンパイルを次に示します(以前のユーザーコードに基づいて再ハッシュされます)。
ファイル数のあるフォルダーをリストします。
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
find
デフォルトでは、すべてのサブディレクトリを再帰的に処理します。複数の場所で機能させる場合は、find
との間のすべてを指定できます-type
。
698035
。約6つの数字が表示されます。
/home
か?私はあなたがそうしないことを100%確信しています。
次の解決策は、現在のディレクトリから使用される実際の使用済みiノードの数をカウントします。
find . -print0 | xargs -0 -n 1 ls -id | cut -d' ' -f1 | sort -u | wc -l
同じサブセットのファイルの数を取得するには、次を使用します。
find . | wc -l
現在のディレクトリ内のファイルを考慮せずに、サブディレクトリのみを探索するソリューションについては、他の回答を参照できます。
find -printf '%i\n' | sort -u | wc -l
。ポータブルにしたい場合は、find . -exec ls -id {} + | cut …
代わりに必要になります。
これを試してみてください:
find -type d -print0 | xargs -0 -I {} sh -c 'printf "%s\t%s\n" "$(find "{}" -maxdepth 1 -type f | wc -l)" "{}"'
ファイル名に改行が含まれていない限り、正常に動作するはずです。
-maxdepth 1
最初のの直後に追加してみてくださいfind
。カウントにサブディレクトリの数を含めたい場合-type f
は、最後にあるものを削除します(実際にはそうであるはずな! -type d
ので、すべての非ディレクトリファイルが含まれるようになります)。
誰も(自分も含めて)誰も知らなかった理由がわかりません:
du --inodes
--inodes
list inode usage information instead of block usage
これでOPの問題が解決されると確信しています。巨大なドライブ内のすべてのジャンクがどこにあるかを調べるために(そして古いディスクにオフロードするために)私はそれをたくさん使い始めました。
再帰したくない場合(他の状況で役立つ場合があります)、追加します
-S, --separate-dirs