9.

Linux ディレクトリ内ファイル数カウント完全ガイド — ls/find/wc

編集
この記事の要点
  • 直下のファイル数 = ls -1 | wc -l-1 で 1 列強制)
  • サブディレクトリ含む再帰 = find dir -type f | wc -l
  • 隠しファイル含めるなら ls -A... は除外)
  • 階層 1 限定再帰: find dir -maxdepth 1 -type f | wc -l、サイズ別: find -size +1M
  • Windows PowerShell: (Get-ChildItem -File).Count / 再帰は -Recurse

直下のファイル数を数える

# 基本: ls の行数を wc で数える
ls dir | wc -l
# → ファイル+ディレクトリ数(隠しファイル除く)

# ls -1 を付けて 1 列出力強制(パイプ時は自動だが念のため)
ls -1 dir | wc -l

# 隠しファイル含める (.* も対象。ただし . と .. は除外)
ls -A dir | wc -l

# 全部 (. と .. 含む。普通は使わない)
ls -a dir | wc -l

注意: ファイルとディレクトリ両方を数えています。区別したい場合は次節を参照。

ファイルだけ / ディレクトリだけ数える

# 直下のファイルのみ (-maxdepth 1 で再帰を抑制)
find dir -maxdepth 1 -type f | wc -l

# 直下のディレクトリのみ (-mindepth 1 で自身を除外)
find dir -mindepth 1 -maxdepth 1 -type d | wc -l

# シンボリックリンクのみ
find dir -maxdepth 1 -type l | wc -l

# ls の Long format から判別 (1 文字目)
ls -l dir | grep -c "^-"    # ファイル
ls -l dir | grep -c "^d"    # ディレクトリ
ls -l dir | grep -c "^l"    # シンボリックリンク

サブディレクトリ含めて再帰的に数える

# 全ファイル (再帰)
find dir -type f | wc -l

# 全ディレクトリ (再帰)
find dir -type d | wc -l
# 自身を除外したいなら -mindepth 1

# 全エントリ (ファイル + ディレクトリ + シンボリックリンク)
find dir | wc -l

パターン別カウント

# 拡張子で絞る
find dir -type f -name "*.log" | wc -l
find dir -type f -name "*.jpg" -o -name "*.png" | wc -l

# サイズ別
find dir -type f -size +1M | wc -l      # 1MB 超
find dir -type f -size -100k | wc -l    # 100KB 未満
find dir -type f -size 0 | wc -l        # 0 バイト

# 更新日時別
find dir -type f -mtime -7 | wc -l      # 7 日以内に更新
find dir -type f -mtime +30 | wc -l     # 30 日以上前

# 所有者別
find dir -type f -user www-data | wc -l
find dir -type f -group nginx | wc -l

# パーミッション別
find dir -type f -perm 777 | wc -l      # 完全公開
find dir -type f -perm /u+w | wc -l     # 所有者書き込み可

ディレクトリごとの内訳を出す

# サブディレクトリ毎の直下ファイル数
for d in */; do
    echo "$d: $(find "$d" -maxdepth 1 -type f | wc -l)"
done

# サブディレクトリ毎の再帰ファイル数 (上位 N)
du -a dir/ | awk '{print $2}' | grep -E '/$' | head -20    # ※ ファイル数ではないので注意

# 再帰ファイル数をディレクトリ別に集計
find dir -type f | awk -F/ '{print $2}' | sort | uniq -c | sort -rn

# tree で階層 1 のサマリ (要 tree インストール)
tree -L 1 dir/
# 出力末尾に "10 directories, 35 files" のサマリあり
tree dir | tail -1

ls だけで雑に数えるショートカット

# 1 行サマリ
ls -1 dir | wc -l

# 出力を直接表示
echo "$(ls -1 dir | wc -l) files in $(realpath dir)"

# 改行を含むファイル名対策 (-print0 + grep -c)
find dir -maxdepth 1 -type f -print0 | grep -zc .

# alias 化
alias countf='ls -1 | wc -l'
alias countf_all='find . -maxdepth 1 -type f | wc -l'

パフォーマンス: 大量ファイル時

# 数百万ファイル時は ls が遅い → find 直接
find dir -maxdepth 1 -type f -printf '.' | wc -c

# 並列処理で速度向上
find dir -type f -print0 | xargs -0 -P 4 -I {} echo {} | wc -l

# 一発で速度計測
time (find dir -type f | wc -l)
time (ls -1 dir | wc -l)

# inode 数で代用 (ファイルシステム全体)
df -i /home
# Filesystem      Inodes    IUsed    IFree IUse% Mounted on
# /dev/sda1     6553600   123456  6430144    2% /home

# ディレクトリの inode 使用量
sudo find /var -xdev -type f -printf "%h\n" | sort | uniq -c | sort -rn | head

Windows PowerShell

# 直下のファイル数
(Get-ChildItem -File).Count

# 隠し含む
(Get-ChildItem -File -Force).Count

# ディレクトリのみ
(Get-ChildItem -Directory).Count

# 再帰
(Get-ChildItem -File -Recurse).Count

# パターン
(Get-ChildItem -File -Recurse -Filter *.log).Count

# サイズフィルタ (1MB 超)
(Get-ChildItem -File -Recurse | Where-Object Length -GT 1MB).Count

# ディレクトリ毎の内訳
Get-ChildItem -Directory | ForEach-Object {
    "$($_.Name): $((Get-ChildItem $_.FullName -File).Count)"
}

# cmd の場合
dir /b /a-d | find /c /v ""

典型シェルスクリプト

#!/bin/bash
# count-files.sh - ディレクトリ内の各種ファイル数をレポート

DIR=${1:-.}

echo "===== File count report for: $(realpath "$DIR") ====="
echo
echo "Direct entries:"
echo "  Files       : $(find "$DIR" -maxdepth 1 -type f | wc -l)"
echo "  Directories : $(find "$DIR" -mindepth 1 -maxdepth 1 -type d | wc -l)"
echo "  Symlinks    : $(find "$DIR" -maxdepth 1 -type l | wc -l)"
echo "  Hidden      : $(find "$DIR" -maxdepth 1 -name ".*" | wc -l)"
echo
echo "Recursive (all):"
echo "  Files       : $(find "$DIR" -type f | wc -l)"
echo "  Directories : $(find "$DIR" -mindepth 1 -type d | wc -l)"
echo
echo "By extension (top 10):"
find "$DIR" -type f -name '*.*' | \
    sed 's/.*\.//' | sort | uniq -c | sort -rn | head -10
echo
echo "Largest files (top 5):"
find "$DIR" -type f -printf "%s %p\n" | sort -rn | head -5 | \
    awk '{printf "  %8.2f MB  %s\n", $1/1024/1024, substr($0, index($0,$2))}'

FAQ

Q: ファイル名に改行が含まれていると wc -l がズレる
A: find ... -print0 | grep -zc . や PowerShell に切り替え。NULL 区切りで安全。

Q: 数百万のファイルがあって遅い
A: ls はソートするため遅い。find 直接 or ls -U(ソート無し)。inode 集計 df -i でも近似値が出ます。

Q: NFS / S3 マウントで時間がかかる
A: ネットワーク往復が支配的。find よりも該当サービス側の API (S3 ListObjects) で集計する方が高速。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ディストリビューション
  2. コマンド一覧
  3. Linuxのサーバーに登録されているユーザの一覧を確認するコマンド
  4. リポジトリの一覧の確認
  5. エラー一覧
  6. ショートカットキー一覧
  7. ログを確認する便利なコマンド
  8. cronの導入と実行方法 (CentOS 7編)
  9. ディレクトリ内のファイル数を確認
  10. 複数ファイル内の文字列を一括置換する方法

最近更新/作成されたページ