「ログのローテーションが正常に動いているか、数で確認したい」
サーバー運用をしていると、ディレクトリ内のファイル数を把握したい場面は意外と多いものです。
バックアップの世代数確認、デプロイ後のファイル検証、ディスク使用量調査の前段階など、「まず数を把握する」という作業は地味ながら欠かせません。
この記事では、ディレクトリ内のファイル数・サブディレクトリ数をカウントする方法を目的別に解説します。
基本の
ls | wc -l から、find を使った正確なカウント、隠しファイルの扱い、特定の拡張子だけを数える方法、さらにスクリプトでの自動監視パターンまで網羅しています。なお、ファイルの中身(行数・単語数・バイト数)を数える
wc コマンドの詳しい使い方はwcコマンドの解説記事をご覧ください。・
ls | wc -l で手早くざっくりカウントする方法(隠しファイル・ディレクトリも含む)・
find /path -type f | wc -l でファイルのみを正確にカウントする方法・
-maxdepth 1 で直下1階層のみ、-name "*.log" で拡張子絞り込みを行う方法・大量ファイル環境では
ls -f でソートを無効化するか find を使うと高速になる理由・スクリプトでファイル数を自動監視するパターン
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜコマンドでファイル数をカウントするのか
「ファイルを数えるだけならls で目視すれば済むのでは?」と思うかもしれません。しかし実務では、目視確認が通用しない場面がいくつかあります。
・ログローテーションの確認:/var/log/ 配下にローテーション済みファイルが想定通りの世代数だけ残っているか
・バックアップの世代管理:7世代分のファイルが正しく保持されているか、古いものが自動削除されているか
・デプロイ後のファイル検証:展開されたファイル数が期待値と一致するか確認する
・監視スクリプト:ファイル数が閾値を超えたらアラートを出す自動化処理
ファイルが数十個を超えた時点で目視カウントは非現実的です。
コマンド1つで正確な数値を得られるようにしておきましょう。
ls + wc でざっくりカウントする方法
最も手軽な方法は、ls の出力行数を wc -l で数えることです。細かい精度よりもスピードを優先したい場面に向いています。
1. カレントディレクトリのファイル数を数える
# カレントディレクトリのエントリ数を表示(ファイル・ディレクトリ両方含む) $ ls | wc -l 15
ls はファイル名を1行ずつ出力し、wc -l がその行数を数えます。「この作業ディレクトリに何個ファイルを置いたっけ?」という場面で重宝します。
ただし、この方法には3つの注意点があります。
・隠しファイルは含まれない:
ls はデフォルトで「.」で始まるファイルを表示しない・ディレクトリも1件としてカウントされる:純粋にファイルだけを数えたい場合は不正確
・サブディレクトリ内は含まれない:直下の1階層だけが対象
2. 特定のディレクトリを指定してカウントする
# /var/log/ 配下のエントリ数を表示 $ ls /var/log/ | wc -l 28
ls の引数にパスを指定すれば、任意のディレクトリを対象にできます。3. 隠しファイルも含めてカウントする
ls -A は「.」(カレント)と「..」(親ディレクトリ)を除いた隠しファイルも含めて表示します。# 隠しファイルも含めたカウント $ ls -A /home/ec2-user/ | wc -l 23 # 隠しファイルを含まないカウント(比較用) $ ls /home/ec2-user/ | wc -l 15
.bashrc、.bash_history、.ssh など)です。ホームディレクトリの全エントリを正確に把握したい場合は
-A を付けましょう。4. ファイルとディレクトリを分けてカウントする(ls + wc の限界)
ls | wc -l はファイルとディレクトリを区別しません。「ファイルだけ何個?」「ディレクトリだけ何個?」を知りたい場合は、次のセクションで紹介する
find コマンドを使ってください。find + wc で正確にカウントする方法
find コマンドは -type オプションでファイルの種類を絞り込めるため、「ファイルのみ」「ディレクトリのみ」を正確に数えられます。スクリプトでの自動化にも向いています。
1. ファイルだけを正確にカウントする(-type f)
# /var/log/ 配下のファイル数(サブディレクトリ内も含む再帰的カウント) $ find /var/log/ -type f | wc -l 156
-type f は「通常のファイル」だけを対象にします。ディレクトリ、シンボリックリンク、デバイスファイルなどは除外されるため、純粋なファイル数が得られます。
2. ディレクトリだけをカウントする(-type d)
# /etc/ 配下のディレクトリ数(サブディレクトリ内も含む) $ find /etc/ -type d | wc -l 85
-type d でディレクトリだけを対象にできます。注意点として、起点ディレクトリ自身(この例では
/etc/)もカウントに含まれます。「サブディレクトリだけ数えたい」場合は、結果から1を引くか、後述の
-maxdepth と組み合わせてください。3. 直下の1階層だけを対象にする(-maxdepth 1)
find はデフォルトでサブディレクトリを再帰的に検索します。ls | wc -l と同じ範囲(直下のみ)に絞りたい場合は -maxdepth 1 を指定します。# /var/log/ 直下のファイルだけカウント(サブディレクトリ内は除外) $ find /var/log/ -maxdepth 1 -type f | wc -l 12 # /var/log/ 直下のディレクトリだけカウント(起点自身は除く) $ find /var/log/ -maxdepth 1 -mindepth 1 -type d | wc -l 5
-mindepth 1 を追加すると起点ディレクトリ自身を除外できます。「直下のサブディレクトリだけ何個?」という確認に使えます。
4. 特定の拡張子のファイルだけを数える(-name)
# .log ファイルだけカウント $ find /var/log/ -type f -name "*.log" | wc -l 23 # .conf ファイルだけカウント $ find /etc/ -type f -name "*.conf" | wc -l 48 # 大文字・小文字を区別しない場合は -iname を使う $ find /var/log/ -type f -iname "*.log" | wc -l 23
-name オプションでファイル名のパターンを指定できます。ワイルドカード(
*)を使う場合はダブルクォートで囲んでください。シェルがワイルドカードを展開してしまうのを防ぐためです。
5. 隠しファイルを除外してカウントする(-not -name)
find はデフォルトで隠しファイルも対象に含めます。除外したい場合は
-not -name ".*" を付けます。# 隠しファイルを除外してカウント $ find /home/ec2-user/ -maxdepth 1 -type f -not -name ".*" | wc -l 8 # 隠しファイルだけをカウント $ find /home/ec2-user/ -maxdepth 1 -type f -name ".*" | wc -l 5
応用:ディレクトリごとの内訳を表示する
ファイル数の「合計」だけでなく、ディレクトリごとの内訳を知りたい場面もあります。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 でインストールしてください(RHEL/CentOS/Rocky Linux系)。実務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 insufficient" admin@example.com fi
cron でこのスクリプトを毎日実行しておけば、バックアップが欠落した日に即座に気づけます。crontab の書き方についてはcrontabコマンドの使い方もあわせて参照してください。
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 ' | sort | head -n "$DELETE_COUNT" | awk '{print $2}' | xargs rm -f echo "[$(date)] ${DELETE_COUNT}個の古いログを削除しました" fi
3. 大量ファイルがあるディレクトリでの高速カウント
数万~数十万のファイルがあるディレクトリでは、ls の処理が遅くなることがあります。・ls が遅い理由:
ls はデフォルトでファイル名をソートするため、ファイル数が多いとソート処理に時間がかかる・対策1:
ls -f | wc -l でソートを無効化する(ただし . と .. も含まれるため、結果から2を引く必要がある)・対策2:
find を使う(find はソートしないため、大量ファイルでも高速)# 大量ファイルのあるディレクトリで高速カウント(findを使う) $ find /path/to/large_dir/ -maxdepth 1 -type f | wc -l 58423 # ls -f でソートを無効化する方法(. と .. の2が含まれる点に注意) $ expr $(ls -f /path/to/large_dir/ | wc -l) - 2 58423
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 なら改行を含むファイル名でも1件として正確にカウントできる $ find . -maxdepth 1 -type f | wc -l 15
find を使うほうが安全です。空のディレクトリで ls | wc -l が「0」にならない場合
ls -a | wc -l を使うと . と .. の2つがカウントされて「2」になります。空かどうかの判定に使うなら、
. と .. を除外する -A オプションを使ってください。# 空のディレクトリを作って確認 $ mkdir /tmp/empty_dir $ ls -a /tmp/empty_dir/ | wc -l 2 # . と .. がカウントされてしまう $ ls -A /tmp/empty_dir/ | wc -l 0 # -A で . と .. を除外すれば正確に 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 -maxdepth 1 -mindepth 1 -type d | 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 |
「ファイル数監視をスクリプト化して、サーバー管理を自動化したい」と思いませんか?
バックアップの世代数チェックやログ削除の自動化は、毎日の運用負荷を大きく減らします。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます