タイトル: ディレクトリ内のファイル数を確認
SEOタイトル: Linux ディレクトリ内ファイル数カウント完全ガイド — ls/find/wc
| この記事の要点 |
|
直下のファイル数を数える
# 基本: 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) で集計する方が高速。