ディレクトリを介してすべてのファイルを再帰的にカウントする方法


47

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

du -sh /*

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



「サブディレクトリ内のサブディレクトリにあるファイルの数」は混乱を招く構成だと思います。あなたが望むものをより明確に述べれば、あなたは法案に合った答えを得るかもしれません。
スティーブンD

@Stevenはそれを自由に書き直します...私の例は、du -sh /*どのようにカウントを機能させたいかをかなり明確にしたと思いました。同じこと、バイトではなくファイルを数えるだけです。
xenoterracide

あなたがiノードの使用について言及しているように、私はあなたがファイルの数をカウントしたいか、使用したiノードの数をカウントしたいかを理解していません。ファイルシステムにハードリンクが存在する場合、2つは異なります。すべてではないにしても、ほとんどの答えはファイルの数を示します。Apple Time Machineバックアップディスクでは使用しないでください。
mouviciel

@mouvicielこれはバックアップディスクでは使用されていません。はい、それらは異なる可能性がありますが、私がいる環境ではハードリンクはほとんどありません。誰かがiノードクォータを使い果たしている場所を把握します。
xenoterracide

回答:


60
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; dowhileループを開始します-whileに入るパイプが開いている限り(ディレクトリのリスト全体が送信されるまで)、readコマンドは変数「dir」に次の行を配置します。その後、続きます...

3番目の部分:printf "%s:\t" "$dir";「$ dir」(ディレクトリ名の1つを保持している)に文字列を出力し、その後にタブを表示します。

4番目の部分:find "$dir -f file"「$ dir」に保持されているディレクトリ名内のすべてのファイルのリストを作成します。このリストはに送信されます。

5番目の部分:wc -l;標準入力に送信される行数をカウントします。

最後の部分:donewhileループを単に終了します。

したがって、現在のディレクトリ内のすべてのディレクトリのリストを取得します。これらのディレクトリごとに、その中にあるすべてのファイルのリストを生成し、を使用してすべてをカウントできるようにしwc -lます。結果は次のようになります。

./dir1: 234
./dir2: 11
./dir3: 2199
...

常にread -rプレーンreadスラッシュとして特別にバックスラッシュを使用します。その後、echo -en "$dir:\t"バックスラッシュを再びマングルします。単純な修正はprintf '%s:\t' "$dir"代わりに使用することです。次に、する$dir必要があります"$dir"常に変数置換の周りに二重引用符を使用します)。
ジル「SO-悪であるのをやめる」

@Giles提案ごとに変更find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" | wc -l; done
xenoterracide

2
私が追加しているsort -n -r -k2ほとんどの使い方がどこにあるか私が知っているように、ディレクトリの多くのために、このの終わりに
xenoterracide

4番目の部分:find "$ dir"は、 "$ dir"に保持されているディレクトリ名内のすべてのファイルのリストを作成します。追加-type fしてファイルをリストするのを忘れた:find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
Krzysztof Boduch 14年

@ krzysiek-boduchありがとう!答えを更新しました。
ショーンJ.ゴフ14年

15

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


13

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

ファイル数のあるフォルダーをリストします。

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

そして、これらのリストコマンドのいずれかの出力をアイテムカウントでソートする場合は、コマンドをソートにパイプします。 "a-list-command" | sort -n
DolphinDream

12

試してください:

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

+1で何か| wc -l ...単語数はとてもいいツールです。
ヨハン

ええ、しかしこれは1つのディレクトリのみを実行します....ディレクトリ内のすべてのディレクトリのカウントを取得したいのですが、毎回個別に実行したくありません...もちろん、ループを使用できると思います...しかし、私は怠け者です。
xenoterracide

findデフォルトでは、すべてのサブディレクトリを再帰的に処理します。複数の場所で機能させる場合は、findとの間のすべてを指定できます-type
ディディエトロセット

その2番目は確かに動作しません.... / homeで試しました。わかった698035 。約6つの数字が表示されます。
xenoterracide

それは私のために働いています-あなたは6ファイルしか持っていないと確信しています/homeか?私はあなたがそうしないことを100%確信しています。
クライハボック

4

次の解決策は、現在のディレクトリから使用される実際の使用済みiノードの数をカウントします。

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

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

find . | wc -l

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


1
ハードリンクを考慮することをお勧めします。GNU findを想定すると、それほど多くの手順は必要ありませんfind -printf '%i\n' | sort -u | wc -l。ポータブルにしたい場合は、find . -exec ls -id {} + | cut …代わりに必要になります。
ジル「SO-悪であるのをやめる」

2

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

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

1

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

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

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


あまりにも再帰的...私はトップレベルを見たいだけで、その下のすべてを合計します。合計...これにより、すべてのディレクトリが印刷されます。
xenoterracide

@xenoterracide:-maxdepth 1最初のの直後に追加してみてくださいfind。カウントにサブディレクトリの数を含めたい場合-type fは、最後にあるものを削除します(実際にはそうであるはずな! -type dので、すべての非ディレクトリファイルが含まれるようになります)。
デニスウィリアムソン

1

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


1
笑、これは最も受け入れられた答えでなければなりません:)
x-yuri

0

du --inodes

誰も(自分も含めて)誰も知らなかった理由がわかりません:

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

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

さらに詳しい情報

再帰したくない場合(他の状況で役立つ場合があります)、追加します

-S, --separate-dirs
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.