Linuxでディレクトリ内のファイル数をカウントする方法|ls・find・wcの実践例


図解60p「Linuxサーバー構築入門マニュアル」無料
登録10秒/自動返信でDL/合わなければ解除3秒
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > Linuxでディレクトリ内のファイル数をカウントする方法|ls・find・wcの実践例
「このディレクトリにファイルが何個あるか、パッと確認したい」
「ログが溜まりすぎていないか、数で把握したい」
サーバー運用では、ディレクトリ内のファイル数を確認する場面が日常的に発生します。バックアップの世代確認、ログローテーションの動作チェック、ディスク容量調査の前段階など、「数を数える」作業は地味ですが欠かせません。

この記事では、ディレクトリ内のファイル数をカウントする方法を目的別に解説します。
基本の ls | wc -l から、find を使った正確なカウント、隠しファイルの扱い、特定の拡張子だけを数える方法、さらにスクリプトでの活用パターンまで網羅しています。

この記事では「ファイル数のカウント方法」を扱います。ファイルの行数・単語数・バイト数を数える wc コマンドの詳しい使い方はwcコマンドの解説記事をご覧ください。

なぜファイル数のカウントが必要なのか?

「ファイルを数えるだけなら、ls で目視すれば済むのでは?」と思うかもしれません。
しかし実務では、以下のような場面でコマンドによるカウントが必要になります。

ログローテーションの確認:/var/log/ 配下にローテーション済みファイルが想定通りの数だけ残っているか
バックアップの世代管理:バックアップディレクトリに7世代分のファイルが正しく保持されているか
デプロイ後のファイル検証:展開されたファイル数が期待値と一致するか
監視スクリプトでの自動チェック:ファイル数が閾値を超えたらアラートを出す

目視確認はファイルが数十個を超えた時点で現実的ではなくなります。コマンド1つで正確な数値を得られるようにしておきましょう。

基本的な使い方(ls + wc でカウント)

最もシンプルな方法は、ls の出力行数を wc -l で数えることです。

1. カレントディレクトリのファイル数を数える

# カレントディレクトリのファイル・ディレクトリ数を表示 $ ls | wc -l 15

ls はファイル名を1行ずつ出力し、wc -l がその行数を数えます。手早くざっくりした数を知りたい時に便利です。

ただし、この方法には注意点があります。

隠しファイルは含まれない:ls は「.」で始まるファイルをデフォルトでは表示しない
ディレクトリも1件としてカウントされる:純粋にファイルだけを数えたい場合は不正確
サブディレクトリ内は含まれない:直下の1階層だけが対象

2. 特定のディレクトリを指定してカウントする

# /var/log/ 配下のファイル・ディレクトリ数を表示 $ ls /var/log/ | wc -l 28

ls の引数にパスを指定すれば、任意のディレクトリを対象にできます。

3. 隠しファイルも含めてカウントする

ls-A オプションを付けると、.(カレント)と ..(親ディレクトリ)を除いた隠しファイルも含めて表示します。

# 隠しファイルも含めたカウント $ ls -A | wc -l 23 # 隠しファイルを含まないカウント(比較用) $ ls | wc -l 15

差分の8個が隠しファイル(.bashrc.bash_history など)です。ホームディレクトリのファイル数を正確に把握したい場合は -A を忘れずに付けてください。

正確なカウント(find + wc)

ls | wc -l は手軽ですが、ディレクトリとファイルを区別できません。正確にファイルだけ、またはディレクトリだけを数えたい場合は find コマンドを使います。

1. ファイルだけを正確にカウントする

# /var/log/ 配下のファイル数(サブディレクトリ内も含む) $ find /var/log/ -type f | wc -l 156

-type f は「通常のファイル」だけを検索対象にします。ディレクトリ、シンボリックリンク、デバイスファイルなどは除外されるため、純粋なファイル数を得られます。

2. ディレクトリだけをカウントする

# /etc/ 配下のディレクトリ数(サブディレクトリ内も含む) $ find /etc/ -type d | wc -l 85

-type d でディレクトリだけを対象にできます。なお、起点ディレクトリ自身(この例では /etc/)もカウントに含まれる点に注意してください。

3. 直下の1階層だけを対象にする(-maxdepth)

find はデフォルトでサブディレクトリを再帰的に検索します。直下だけを対象にしたい場合は -maxdepth 1 を指定します。

# /var/log/ 直下のファイル数だけ(サブディレクトリ内は除外) $ find /var/log/ -maxdepth 1 -type f | wc -l 12

ls | wc -l と似た結果になりますが、find -maxdepth 1 -type f のほうがファイルだけを正確にカウントできます。

4. 特定の拡張子のファイルだけを数える

# .log ファイルだけを数える $ find /var/log/ -type f -name "*.log" | wc -l 23 # .conf ファイルだけを数える $ find /etc/ -type f -name "*.conf" | wc -l 48

-name オプションでファイル名のパターンを指定できます。ワイルドカード(*)を使う場合はダブルクォートで囲んでください。シェルがワイルドカードを展開してしまうのを防ぐためです。

5. 隠しファイルを除外してカウントする

find はデフォルトで隠しファイルも検索対象に含めます。除外したい場合は -not -name ".*" を付けます。

# 隠しファイルを除外してカウント $ find /home/user/ -type f -not -name ".*" | wc -l 42

反対に、隠しファイルだけを数えたい場合は -name ".*" を指定します。

# 隠しファイルだけをカウント $ find /home/user/ -type f -name ".*" | wc -l 8

応用:ディレクトリごとの内訳を表示する

ファイル数の「合計」だけでなく、ディレクトリごとの内訳を知りたい場面もあります。

1. 各サブディレクトリのファイル数を一覧表示する

# /var/log/ の各サブディレクトリのファイル数を表示 $ for dir in /var/log/*/; do echo "$(find "$dir" -type f | wc -l) $dir"; done | sort -rn 45 /var/log/httpd/ 32 /var/log/audit/ 18 /var/log/sa/ 7 /var/log/tuned/

どのディレクトリにファイルが集中しているかが一目でわかります。ディスク容量調査の前段階で、問題のある場所を素早く特定する際に役立ちます。

2. treeコマンドでディレクトリ構造とファイル数を確認する

tree コマンドがインストールされていれば、ディレクトリ構造をツリー形式で表示し、末尾にファイル数とディレクトリ数のサマリーが出力されます。

# ディレクトリ構造とファイル数を表示 $ tree /var/log/httpd/ /var/log/httpd/ ├── access_log ├── error_log ├── access_log-20260322 └── error_log-20260322 0 directories, 4 files # 2階層までに制限する $ tree -L 2 /var/log/

tree はデフォルトではインストールされていない場合があります。yum install tree または dnf install tree でインストールしてください。

実務Tips:スクリプトでのファイル数チェック

運用現場では、ファイル数のカウントをスクリプトに組み込んで自動監視する場面がよくあります。

1. バックアップファイルの世代数を確認するスクリプト

#!/bin/bash # バックアップの世代数が7未満ならアラートを出す BACKUP_DIR="/backup/daily" EXPECTED=7 ACTUAL=$(find "$BACKUP_DIR" -maxdepth 1 -type f -name "*.tar.gz" | wc -l) if [ "$ACTUAL" -lt "$EXPECTED" ]; then echo "警告: バックアップが${ACTUAL}世代しかありません(期待値: ${EXPECTED})" | \ mail -s "[Alert] Backup count" admin@example.com fi

2. ログファイルが増えすぎたら古いものを削除する

#!/bin/bash # /var/log/app/ のログが100個を超えたら、古い順に削除 LOG_DIR="/var/log/app" MAX_FILES=100 FILE_COUNT=$(find "$LOG_DIR" -maxdepth 1 -type f -name "*.log" | wc -l) if [ "$FILE_COUNT" -gt "$MAX_FILES" ]; then DELETE_COUNT=$((FILE_COUNT - MAX_FILES)) find "$LOG_DIR" -maxdepth 1 -type f -name "*.log" -printf '%T+ %p\n' | \ sort | head -n "$DELETE_COUNT" | awk '{print $2}' | xargs rm -f echo "${DELETE_COUNT}個の古いログを削除しました" fi

3. ファイル数が多いディレクトリでのパフォーマンス

数万~数十万のファイルがあるディレクトリでは、ls の処理が遅くなることがあります。

ls が遅い原因:ls はファイル一覧をソートするため、ファイル数が多いとソート処理に時間がかかる
対策1:ls -f | wc -l でソートを無効化する(ただし ... も含まれるため、数値から2を引く必要がある)
対策2:find を使う(find はソートしないため、大量ファイルでも高速)

# 大量ファイルがあるディレクトリで高速にカウント $ find /path/to/large_dir/ -maxdepth 1 -type f | wc -l # ls -f でソートを無効化(. と .. が含まれる点に注意) $ ls -f /path/to/large_dir/ | wc -l

数万ファイル規模のディレクトリでは、find を使うほうが確実です。

トラブルシュート:意図しない結果になる場合


「Permission denied」でカウントが不正確になる

find でアクセス権限のないディレクトリを検索すると、標準エラー出力に「Permission denied」が表示され、そのディレクトリ内のファイルはカウントされません。

# エラーメッセージを抑制してカウント $ find /var/log/ -type f 2>/dev/null | wc -l 156 # sudo で実行すれば全ディレクトリにアクセスできる $ sudo find /var/log/ -type f | wc -l 163

2>/dev/null でエラーメッセージを非表示にできますが、カウントから漏れるファイルがある点は認識しておいてください。正確な数が必要なら sudo で実行しましょう。

ls | wc -l でファイル名に改行が含まれるとカウントがずれる

これは極めてまれなケースですが、ファイル名に改行文字が含まれていると ls | wc -l の結果が実際のファイル数より大きくなります。

# ファイル名に改行を含むファイルが存在する場合 $ ls | wc -l 16 # find なら正確にカウントできる $ find . -maxdepth 1 -type f | wc -l 15

通常の運用で遭遇することはほぼありませんが、信頼性が求められるスクリプトでは find を使うほうが安全です。

空のディレクトリで ls | wc -l が「0」にならない

空のディレクトリで ls | wc -l を実行すると、ls が何も出力しないにもかかわらず wc -l が「0」を返します。これは正常な動作です。

ただし、ls -a | wc -l を使うと ... の2つがカウントされて「2」になるため、空かどうかの判定に使うなら ls -A | wc -l-A... を除外)を使ってください。

# 空のディレクトリで確認 $ mkdir /tmp/empty_dir $ ls -a /tmp/empty_dir/ | wc -l 2 $ ls -A /tmp/empty_dir/ | wc -l 0

本記事のまとめ

ディレクトリ内のファイル数をカウントする方法を一覧表にまとめます。

やりたいこと コマンド
カレントディレクトリの数をざっくり数える ls | wc -l
隠しファイルも含めて数える ls -A | wc -l
ファイルだけを正確に数える(再帰的) find /path/ -type f | wc -l
ディレクトリだけを数える find /path/ -type d | wc -l
直下の1階層だけを対象にする find /path/ -maxdepth 1 -type f | wc -l
特定の拡張子のファイルを数える find /path/ -type f -name "*.log" | wc -l
隠しファイルを除外して数える find /path/ -type f -not -name ".*" | wc -l
ディレクトリごとの内訳を表示する for dir in /path/*/; do echo "$(find "$dir" -type f | wc -l) $dir"; done | sort -rn
ツリー形式でファイル数を確認する tree /path/

「ls | wc -l」の先にある、サーバー運用の全体像を学びませんか?

ファイル数のカウントは、サーバー運用で日常的に使う基本スキルの一つです。しかし、本当に大切なのはコマンド単体の知識ではなく、それらを組み合わせてサーバーを安全に管理できる力です。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。



無料プレゼント
図解60p「Linuxサーバー構築入門マニュアル」
独学で詰まる前に、“型(手順書)”で最初の環境構築をサクッと終わらせましょう。
登録10秒/自動返信でDL/合わなければ解除3秒
無料で受け取る ※メールアドレスだけでもOK(必須項目は最小限)

宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

図解60pのLinux無料マニュアル
登録10秒/自動返信でDL
無料で受け取る