Linuxディレクトリ内のファイルを再帰的にカウントする


728

Linuxディレクトリ内のファイルを再帰的にカウントするにはどうすればよいですか?

私はこれを見つけました:

find DIR_NAME -type f ¦ wc -l

しかし、これを実行すると、次のエラーが返されます。

検索:パスは式の前になければなりません:¦


64
壊れたバー¦(ASCII 166)とUNIXパイプラインに|使用される垂直バー(ASCII 124)を混同しています。
Skippy le Grand Gourou 2014年

7
@SkippyleGrandGourouパイプって呼んでないの?
DaveStephens、2015

27
@DaveStephensはい、それはそれとも呼ばれています。シェファーストローク、バーティバー、vバー、スティック、垂直線、垂直スラッシュ、バー、オベリスク、グリダスとも呼ばれます。
emlai 2015

64
@zenith私はボブと呼んでいます。
クリストファー

15
RFC20では「垂直線」と呼ばれています。「パイプ」は、シンボルの名前ではなく、シェルオペレーターの名前です。同じように*、いくつかの他の文脈では、「アスタリスク」ASCII文字が、「時代」です。
2017

回答:


1327

これはうまくいくはずです:

find DIR_NAME -type f | wc -l

説明:

  • -type f ファイルのみを含めます。
  • |ではなく¦findコマンドの標準出力をwcコマンドの標準入力にリダイレクトします。
  • wc(単語数の省略)入力(docs)の改行、単語、バイトを数えます。
  • -l 改行だけを数える。

ノート:

  • に置き換えDIR_NAME.、現在のフォルダーでコマンドを実行します。
  • を削除し-type fて、ディレクトリ(およびシンボリックリンク)をカウントに含めることもできます。
  • ファイル名に改行文字を含めることができる場合、このコマンドが過大評価される可能性があります。

例が機能しない理由の説明:

表示したコマンドでは、「パイプ」(|)を使用して2つのコマンドを接続するので¦はなく、シェルがコマンドまたは類似のものとして認識しない壊れたバー()を使用しています。そのため、そのエラーメッセージが表示されます。


27
f中には、-type fファイルのためと略wc -lワードカウントラインのために。
Serge Stroobandt 2013年

3
-type fカウントにディレクトリを含めるためにを削除します
phatblat 2013年

3
-print旗の必要はありません
ゾルタン

3
ファイル名に改行文字が含まれている可能性がある場合は、-print0フラグを使用できます。
gaboroncancio 2014年

2
@gaboroncancioの実装にwcnullで終了するリストを読み取るオプションがない限り、これは役に立ちません。代替案については私の答えを参照してください。
モニカを復活させます2015

100

現在のディレクトリの場合:

find -type f | wc -l

5
このソリューションでは、改行を含むファイル名は考慮されません。
Kusalananda

2
現在のディレクトリについては、必要はありません.
baptx

1
実際には、いくつかのプラットフォーム上で、あなたはない綴るする必要がありますfind .
tripleee

1
@Kusalanandraあなたのコメントは、ここでのほぼすべての回答に適用されます。
Tripleee

69

現在のディレクトリの下の各ディレクトリにあるファイルの数の内訳が必要な場合:

for i in */ .*/ ; do 
    echo -n $i": " ; 
    (find "$i" -type f | wc -l) ; 
done

もちろん、すべてを1行で実行できます。括弧wc -lは、誰の出力が(find $i -type fこの場合)監視されることになっているのかを明確にします。


7
名前にスペースが含まれているディレクトリでスタックする可能性があります。最初の行を変更してfind . -maxdepth 1 -type d -print0 | while IFS= read -r -d '' i ; do修正します。ファイル(データストリーム、変数)を行ごと(および/またはフィールドごと)に読み取る方法を
アーチスタントン

4
find外側のループに使用するのは、不必要な面倒なことです。for i in */; do`
tripleee

function countit {for i in $(find。-maxdepth 1 -type d); do file_count = $(find $ i -type f | wc -l); echo "$ file_count:$ i"; 完了}; countit | ソート-n -r
Schneems

最後にこれが私が必要としたものです。私のフォルダーには何千ものファイルが含まれているため、ツリーなどで印刷することはできません
lesolorzanov

これには../が含まれており、先に進んでいないように見えます。つまり、退行的ではありません。
Daniel Lefebvre

50

使用できます

$ tree

ツリーパッケージをインストールした後

$ sudo apt-get install tree

(Debian / Mint / Ubuntu Linuxマシン上)。

このコマンドは、ファイルの数だけでなく、ディレクトリの数も個別に表示します。オプション-Lを使用して、最大表示レベル(デフォルトでは、ディレクトリツリーの最大の深さ)を指定できます。

-aオプションを指定することにより、隠しファイルも含めることができます。


4
これは実際には、ディレクトリとファイルの数を確認する最も簡単な方法です。
Lorem Ipsum Dolor 2016年

11
manページから:デフォルトでは、ツリーは隠しファイルを印刷しません。あなたは提供する必要があり-a、それらを含めるオプションを。
eee 2016年

3
これをmacOSにインストールするには、を使用brewして実行brew install treeしますbrew update。実行後に実行することをお勧めします。
Ashish Ahuja

4
また、すべてのファイル名を印刷するため、多くのファイルがある場合は遅くなります。
フランクDernoncourt

2
うわー、とても素晴らしいツールです。色分けされたフォルダーを印刷し、フォルダーのみをリストし、JSONとして出力できます。それは非常に数秒で34kフォルダーと51kファイルを一覧表示できます。オレ!
ブラソフィロ

46

私のコンピュータでrsyncfind | wc -l、受け入れられた答えよりも少し高速です:

$ rsync --stats --dry-run -ax /path/to/dir /tmp

Number of files: 173076
Number of files transferred: 150481
Total file size: 8414946241 bytes
Total transferred file size: 8414932602 bytes

2行目にはファイル数があり、上の例では150,481です。ボーナスとして、合計サイズ(バイト単位)も取得します。

備考:

  • 最初の行は、ファイル、ディレクトリ、シンボリックリンクなどをまとめた数です。そのため、2行目よりも大きくなっています。
  • --dry-run(または-n略して)オプションは、実際にファイルを転送しないことが重要です!
  • -x「ファイルシステムの境界を越えない」オプションを使用しました。つまり、実行し/て外部ハードディスクが接続されている場合、ルートパーティションのファイルのみがカウントされます。

ここでrsyncを使用するという考えが気に入っています。私はそれについて考えたことはなかったでしょう!
Qeole

@Qeoleに感謝しますが、アイデアは私のものではありません。数年前に、rsyncがファイルとサブフォルダーの多いフォルダーを削除するのが最も速いということをどこかで読んだので、ファイルを数えるのも迅速だと思いました。
psmith 2016

1
これを試しました。両方を事前に2回実行してfsキャッシュにデータを入力した後、find ~ -type f | wc -l1.7 / 0.5 / 1.33秒かかりました(real / user / sys)。rsync --stats --dry-run -ax ~ /xxx4.4 / 3.1 / 2.1秒かかりました。SSD上のファイル数は約500,000です。
2017

あなたのrsyncの知らんどのバージョンが使用されるが、3.1.2で、それは読むために少し簡単です:Number of files: 487 (reg: 295, dir: 192)
MPEN

私はmacOSでデフォルトのrsyncを使用しました:rsync version 2.6.9 protocol version 29
psmith

20

UNIXのファイル名には改行が含まれている可能性があるため(はい、改行)、wc -lファイルが多すぎる可能性があります。すべてのファイルにドットを印刷してから、ドットを数えます。

find DIR_NAME -type f -printf "." | wc -c

1
これは、名前に改行が含まれるファイルを処理する唯一のソリューションのようです。賛成。
codeforester 2018年

2
hihi :)ファイル名の改行が大好きです。それはそれらをより読みやすくします。
hek2mgl 2018年

つまり、ファイル名の改行はコンテンツではありません!
codeforester 2018年

1
私は冗談を言っていました...ええ、ファイル名の改行は常に考慮に入れられなければなりません。それらは、タイプミスからの悪意のあるコンテンツまたはそれほど目立たないコンテンツに由来する可能性があります。
hek2mgl 2018年

18

ここでいくつかの答えを組み合わせると、最も有用な解決策は次のようになります。

find . -maxdepth 1 -type d -print0 |
xargs -0 -I {} sh -c 'echo -e $(find "{}" -printf "\n" | wc -l) "{}"' |
sort -n

スペースの括弧や改行を含むファイル名のような奇妙なことも処理できます。また、出力をファイル数でソートします。

-maxdepthサブディレクトリもカウントされるようにするには、この数を増やします。特に、非常にネストされたディレクトリ構造と-maxdepth多数のディレクトリを組み合わせている場合、これには時間がかかる可能性があることに注意してください。


とは何echo -eですか?改行を折りたたむためにそれを入れたと思いますが、他の不規則な空白を壊し、ファイル名にそのまま存在するワイルドカード文字を展開しようとします。私は単純にのようなものに行きfind .* * -type d -execdir sh -c 'find . -type f -printf "\n" | wc -l; pwd'、出力に異常があればそれで生きるか、またはprintf "%q"ディレクトリ名を出力するためにBashで遊ぶかもしれません。
tripleee

10

現在の作業ディレクトリから存在するファイルとサブディレクトリの数を知りたい場合は、このワンライナーを使用できます

find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find {} | wc -l) {}' | sort -n

これはGNUフレーバーで機能し、BSD linux(OSXなど)のechoコマンドから-eを省略します。


2
優れたソリューション!私が見つけた唯一の問題は、スペースまたは特殊文字を含むディレクトリでした。DIR名が使用されている場所で引用符を追加しますfind . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo -e $(find "{}" | wc -l) "{}"' | sort -n
ジョンKary

1
私はそれを少し変更しましたが、それは私にとって非常にうまく機能します:find . -maxdepth 1 -type d -print0 | xargs -0 -I {} sh -c 'echo $(find {} | wc -l) \\t {}' | sort -rn | less
Wizek

@セバスチャンの答えに対する私のコメントはここにも当てはまります。echo -e引用符で囲まれていないディレクトリ名で(または前のコメントのように単に「echo」)を使用すると、問題が発生します。
Tripleee

8

エラーが発生しないようにwc -lしたい場合は、改行付きのファイルの表示を許可しないでください(2行以上としてカウントされます)。

たとえば、単一のEOL文字が含まれる単一のファイルがある場合を考えます。

> mkdir emptydir && cd emptydir
> touch $'file with EOL(\n) character in it'
> find -type f
./file with EOL(?) character in it
> find -type f | wc -l
2

少なくともgnuにwcはnullで終了するリストを(ファイルからを除いて)読み取り/カウントするオプションがないように見えるため、最も簡単な解決策は、ファイル名を渡さず、ファイルが見つかるたびに静的な出力を渡すことです。上記と同じディレクトリ

> find -type f -exec printf '\n' \; | wc -l
1

またはあなたfindがそれをサポートしている場合

> find -type f -printf '\n' | wc -l
1 

7

コマンドを使用できますncdu。Linuxディレクトリに含まれるファイルの数を再帰的にカウントします。次に出力の例を示します。

ここに画像の説明を入力してください

進行状況バーがあり、多くのファイルがある場合に便利です。

ここに画像の説明を入力してください

Ubuntuにインストールするには:

sudo apt-get install -y ncdu

ベンチマーク:ファイル数をカウントする必要があるフォルダーとして、https://archive.org/details/cv_corpus_v1.tar(380390ファイル、11 GB)を使用しました。

  • find . -type f | wc -l:完了まで約1分20秒
  • ncdu:完了まで約1分20秒

ファイルの数ではなく、主にディスク使用量を計算します。この追加のオーバーヘッドはおそらく望ましくありません。(標準のPOSIXユーティリティで実行できる何かのために追加のパッケージをインストールする必要があることに加えて)
hek2mgl

@ hek2mgl最初のスクリーンショットに赤で示されているように、ファイル数を計算します。200万ファイルまで数分かかったので、速度はそれほど悪くありません。
フランクダーノンコート

2
@ hek2mgl回答に再現可能なベンチマークを追加しました。2回実行しましたが、との間に違いはfind . -type f | wc -lありませんでしたncdu
フランクダーノンコート2018

2
はい、のバックエンドであるのとfindほぼ同じシステムコールを実行しているようです。ちょうどそれらをたどった。duncdu
hek2mgl

1
@FranckDernoncourtが気に入りました。私はフォルダに大量のファイルを保存しており、プログレスバーを使用することで命を救うことができます。共有してくれてありがとう!
オタク


4

現在のディレクトリにあるファイルの数を確認するには、を入力しls -1 | wc -lます。これは、の出力のwc行数のカウントに使用されます。ドットファイルはカウントされません。このHOWTOの以前のバージョンで使用した(前の例のように "1"ではなく "L"である)と、実際のファイル数よりも1つ多いファイル数が得られることに注意してください。この点についてはカムネジャドに感謝します。(-l)ls -1ls -l

ファイルのみを数え、シンボリックリンクを含まない場合(他にできることのほんの一例)、使用できますls -l | grep -v ^l | wc -l(これは今回は「1」ではなく「L」です。ここでは「長い」リストが必要です)。 。grep"l"(リンクを示す)で始まる行をチェックし、その行を破棄します(-v)。

相対速度:「ls -1 / usr / bin / | wc -l」は、アンロードされた486SX25で約1.03秒かかります(このマシンの/ usr / bin /には355ファイルあります)。「ls -l /usr/bin/ | grep -v ^l | wc -l」には約1.19秒かかります。

出典:http : //www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x700.html


2
ls -lstatサイズ、mtime、その他のプロパティを読み取るには、すべてのファイルでsyscallを実行する必要がありますが、これは低速です。大きなディレクトリ(100.000以上のファイル)では、実行ls -lに数分かかる場合があります。したがって、ファイルのみをカウントするには、常にを使用しますls -1 | wc -l
Marki555 2014年

A 486SX25、素晴らしい
cam8001 2017年

ls -1ファイルを並べ替える必要があるため、大きなディレクトリではまだ遅くなる可能性があります。単純printf '%s\n' *に同じことを行い、外部ls呼び出し(とにかく問題ある)を回避しますが、最も効率的な解決策は、などの並べ替えを実行しないコマンドを使用することfindです。(グロブの出力はシェルによってソートされます。)
tripleee

4

特定のファイルタイプを 再帰的にカウントする必要がある場合は、次のようにできます。

find YOUR_PATH -name '*.html' -type f | wc -l 

-l 出力の行数を表示するだけです。


拡張子はファイル名の一部であり、ファイルTYPEを表していない場合があります
Waxhead

4

bashの場合:

()でエントリの配列を作成し、#でカウントを取得します。

FILES=(./*); echo ${#FILES[@]}

ファイルを再帰的に数えませんが、シンプルなオプションを最初に表示したいと思います。一般的な使用例は、ファイルのロールオーバーバックアップを作成する場合です。これにより、logfile.1、logfile.2、logfile.3などが作成されます。

CNT=(./logfile*); mv logfile logfile.${#CNT[@]}

bash 4+をglobstar有効にした再帰的なカウント(@tripleeeで言及)

FILES=(**/*); echo ${#FILES[@]}

ファイルの数を再帰的に取得するために、同じようにfindを使用できます。

FILES=(`find . -type f`); echo ${#FILES[@]}

最新のシェル**/*は再帰的な列挙をサポートしています。findシェルは各ディレクトリ内のファイルを並べ替える必要があるため、大きなディレクトリよりも効率的ではありません。
Tripleee

2

名前にスペースが含まれるディレクトリの場合...(上記のさまざまな回答に基づく)-ディレクトリ名とその中のファイル数を再帰的に出力します。

find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done

(読みやすいようにフォーマットされています):

pwd
  /mnt/Vancouver/Programming/scripts/claws/corpus

ls -l
  total 8
  drwxr-xr-x 2 victoria victoria 4096 Mar 28 15:02 'Catabolism - Autophagy; Phagosomes; Mitophagy'
  drwxr-xr-x 3 victoria victoria 4096 Mar 29 16:04 'Catabolism - Lysosomes'

ls 'Catabolism - Autophagy; Phagosomes; Mitophagy'/ | wc -l
  138

## 2 dir (one with 28 files; other with 1 file):
ls 'Catabolism - Lysosomes'/ | wc -l
  29

ディレクトリ構造は以下を使用してより視覚化されtreeます:

tree -L 3 -F .
  .
  ├── Catabolism - Autophagy; Phagosomes; Mitophagy/
  │   ├── 1
  │   ├── 10
  │   ├── [ ... SNIP! (138 files, total) ... ]
  │   ├── 98
  │   └── 99
  └── Catabolism - Lysosomes/
      ├── 1
      ├── 10
      ├── [ ... SNIP! (28 files, total) ... ]
      ├── 8
      ├── 9
      └── aaa/
          └── bbb

  3 directories, 167 files

man find | grep mindep
  -mindepth levels
    Do not apply any tests or actions at levels less than levels
    (a non-negative integer).  -mindepth 1 means process all files
    except the starting-points.

ls -p | grep -v /(以下で使用)は/unix/48492/list-only-regular-files-but-not-directories-in-current-directoryの回答2からのものです

find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done
./Catabolism - Autophagy; Phagosomes; Mitophagy: 138
./Catabolism - Lysosomes: 28
./Catabolism - Lysosomes/aaa: 1

適用: 私は数百のディレクトリ(すべての深さ= 1)の中でファイルの最大数を見つけたいです

date; pwd
    Fri Mar 29 20:08:08 PDT 2019
    /home/victoria/Mail/2_RESEARCH - NEWS

time find . -mindepth 1 -type d -print0 | while IFS= read -r -d '' i ; do echo -n $i": " ; ls -p "$i" | grep -v / | wc -l ; done > ../../aaa
    0:00.03

[victoria@victoria 2_RESEARCH - NEWS]$ head -n5 ../../aaa
    ./RNA - Exosomes: 26
    ./Cellular Signaling - Receptors: 213
    ./Catabolism - Autophagy; Phagosomes; Mitophagy: 138
    ./Stress - Physiological, Cellular - General: 261
    ./Ancient DNA; Ancient Protein: 34

[victoria@victoria 2_RESEARCH - NEWS]$ sed -r 's/(^.*): ([0-9]{1,8}$)/\2: \1/g' ../../aaa | sort -V | (head; echo ''; tail)

    0: ./Genomics - Gene Drive
    1: ./Causality; Causal Relationships
    1: ./Cloning
    1: ./GenMAPP 2
    1: ./Pathway Interaction Database
    1: ./Wasps
    2: ./Cellular Signaling - Ras-MAPK Pathway
    2: ./Cell Death - Ferroptosis
    2: ./Diet - Apples
    2: ./Environment - Waste Management

    988: ./Genomics - PPM (Personalized & Precision Medicine)
    1113: ./Microbes - Pathogens, Parasites
    1418: ./Health - Female
    1420: ./Immunity, Inflammation - General
    1522: ./Science, Research - Miscellaneous
    1797: ./Genomics
    1910: ./Neuroscience, Neurobiology
    2740: ./Genomics - Functional
    3943: ./Cancer
    4375: ./Health - Disease 

sort -V自然な種類です。...つまり、これらの(Claws Mail)ディレクトリのいずれかにあるファイルの最大数は4375ファイルです。これらのファイル名を左パディング(https://stackoverflow.com/a/55409116/1904943)した場合、これらのファイル名はすべて、各ディレクトリで1から始まる数値で名前が付けられ、合計5桁になるようにパディングされます。 。


補遺

ディレクトリ内のファイル、サブディレクトリの総数を見つけます。

$ date; pwd
Tue 14 May 2019 04:08:31 PM PDT
/home/victoria/Mail/2_RESEARCH - NEWS

$ ls | head; echo; ls | tail
Acoustics
Ageing
Ageing - Calorie (Dietary) Restriction
Ageing - Senescence
Agriculture, Aquaculture, Fisheries
Ancient DNA; Ancient Protein
Anthropology, Archaeology
Ants
Archaeology
ARO-Relevant Literature, News

Transcriptome - CAGE
Transcriptome - FISSEQ
Transcriptome - RNA-seq
Translational Science, Medicine
Transposons
USACEHR-Relevant Literature
Vaccines
Vision, Eyes, Sight
Wasps
Women in Science, Medicine

$ find . -type f | wc -l
70214    ## files

$ find . -type d | wc -l
417      ## subdirectories

1

私は特定の状況下で再帰的なファイルカウントを高速化するためにffcntを作成しました:エクステントマッピングをサポートする回転ディスクとファイルシステム。

それは、lsまたはfindベースのアプローチよりも桁違いに速い場合がありますが、YMMVです。


0

ここには多くの正解があります。これが別です!

find . -type f | sort | uniq -w 10 -c

ここで、.は検索するフォルダで10、ディレクトリをグループ化するために使用する文字数です。


-1

find -type f | wc -l

または(ディレクトリが現在のディレクトリの場合)

見つける -type f | wc -l


これは、この同じ質問に対する他の少なくとも1つの回答を複製します。
Kusalananda

-1

これは完全に正常に動作します。シンプルなショート。フォルダに存在するファイルの数を数えたい場合。

ls | wc -l

3
まず第一に、これは質問に答えません。問題は、ディレクトリから前方にファイルを再帰的にカウントすることであり、表示するコマンドはそれを行いません。さらに、lsを使用すると、ファイルだけでなくディレクトリもカウントされます。また、新しいものを何も追加せず、質問を適切に読まない場合でも、古い質問に答える理由はありません。その際はご遠慮ください。
XFCC 2018

-1

フォーマットをフィルタリングするこの代替アプローチでは、使用可能なすべてのGRUBカーネルモジュールがカウントされます。

ls -l /boot/grub/*.mod | wc -l

-3
ls -l | grep -e -x -e -dr | wc -l 
  1. 長いリスト
  2. フィルターファイルとディレクトリ
  3. フィルターされた行を数える
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.