「ログが溜まりすぎていないか、数で把握したい」
サーバー運用では、ディレクトリ内のファイル数を確認する場面が日常的に発生します。バックアップの世代確認、ログローテーションの動作チェック、ディスク容量調査の前段階など、「数を数える」作業は地味ですが欠かせません。
この記事では、ディレクトリ内のファイル数をカウントする方法を目的別に解説します。
基本の
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
.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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
