web-dev-qa-db-ja.com

ディレクトリを介してすべてのファイルを再帰的に数えるには

サブディレクトリにあるファイルの数を確認して、すべてのiノードの使用がシステムのどこにあるかを確認します。スペース使用のためにこれをやるようなもの

du -sh /*

これにより、ルート以外のディレクトリで使用されるスペースが得られますが、この場合はサイズではなくファイル数が必要です。

52
xenoterracide
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
...
67
Shawn J. Goff

find . -type f | wc -lを試してください。現在のディレクトリにあるすべてのファイルとサブディレクトリにあるすべてのファイルの数がカウントされます。すべてのディレクトリはファイルとしてカウントされず、通常のファイルのみがカウントされることに注意してください。

17
herohuyongtao

以下は、いくつかの便利なリストコマンドのコンパイルです(以前のユーザーコードに基づいて再ハッシュされています)。

フォルダをファイル数でリスト:

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
13
DolphinDream

試してください:

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
12
Cry Havok

次のソリューションは、現在のディレクトリから始まる実際の使用済みiノードの数をカウントします。

find . -print0 | xargs -0 -n 1 ls -id | cut -d' ' -f1 | sort -u | wc -l

同じサブセットのファイル数を取得するには、次を使用します。

find . | wc -l

現在のディレクトリのファイルを考慮せずにサブディレクトリのみを探索するソリューションについては、他の回答を参照できます。

4
mouviciel

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
2
abeboparebop

私はパーティーに遅れていることを知っていますが、この純粋な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
...
2
jimmij

これを試してみてください:

find -type d -print0 | xargs -0 -I {} sh -c 'printf "%s\t%s\n" "$(find "{}" -maxdepth 1 -type f | wc -l)" "{}"'

ファイル名に改行が含まれていない限り、問題なく動作するはずです。

du --inodes

なぜ誰も(私も含めて)誰も気づかなかったのかわかりません。

du --inodes
--inodes
      list inode usage information instead of block usage

これでOPの問題が解決すると確信しています。私はそれをたくさん使って、私の巨大なドライブのすべてのジャンクがどこにあるかを見つけ出しました(そしてそれを古いディスクにオフロードしました)。

詳細情報

再帰したくない場合(これは他の状況で役立ちます)、追加します

-S, --separate-dirs
1

ncduをインストールしている場合(いくつかのクリーンアップを行うには必須)、単にcと入力して「子アイテム数の表示を切り替えます」。そしてCを「アイテムで並べ替え」に。

1
Demi-Lune