Linuxでファイルを探すとき、最も手軽に使えるのがワイルドカードです。
*
や?
などを組み合わせるだけで、複雑なファイル名でも簡単にまとめて検索できます。
でも、実はワイルドカードはコマンドによって挙動が少しずつ違い、うまく使い分けると検索がぐっと便利になります。
例えば、以下のような場面でワイルドカードが活躍します。
- 特定の拡張子のファイルをすべて表示したい
- 日付が入ったログファイルを検索したい
- 複数のディレクトリから一気にファイルを探したい
- ファイル名の一部だけ覚えている場合の検索
- 大量のファイルから条件に合うものだけを抽出したい
この記事では、Linuxでワイルドカードを使ってファイルを検索する基本から、ls
、find
、grep
での活用例、実践的なテクニックまでわかりやすく紹介します。
Linuxのワイルドカードとは?
ワイルドカードとは、特定のパターンにマッチする文字列を表現するための特殊文字です。これを使うことで、一度に複数のファイルを指定できます。
基本的なワイルドカード
*
(アスタリスク)
- 意味:任意の文字列(0文字以上)にマッチ
- 使用例:
*.txt # abc.txt、notes.txt、report.txt など
file* # file、file1、file_backup など
*report* # daily_report.txt、report_2023.doc など
?
(クエスチョンマーク)
- 意味:任意の1文字にマッチ
- 使用例:
file?.log # file1.log、fileA.log など
(file.logは×)test???.txt # test123.txt、testABC.txt など
202?-??.log # 2023-01.log、2024-12.log など
[]
(ブラケット)
- 意味:指定した文字のどれか1文字にマッチ
- 使用例:
file[12].log # file1.log、file2.log のみ
[abc]*.txt # a*.txt、b*.txt、c*.txt にマッチ
test[0-9].log # test0.log ~ test9.log
[A-Z]*.conf # 大文字で始まるconfファイル
高度なワイルドカード
{}
(ブレース展開)
- 意味:複数のパターンを同時に指定
- 使用例:
{*.txt,*.log} # .txtと.logファイル両方
file{1,2,3}.log # file1.log、file2.log、file3.log
backup.{2023,2024} # backup.2023、backup.2024
[^]
(否定)
- 意味:指定した文字以外にマッチ
- 使用例:
[^0-9]* # 数字で始まらないファイル
test[^abc].log # testd.log、teste.log など(testa.logは×)
**
(グロブスター)
- 意味:任意の階層のディレクトリにマッチ(bash 4.0以降)
- 使用例:
**/*.log # すべてのサブディレクトリの.logファイル
src/**/*.py # srcディレクトリ以下のすべての.pyファイル
これがLinuxで使うワイルドカードの基本です。次は実際のコマンドでどう使うかを見ていきましょう。
lsでワイルドカードを使ったファイル検索
ls
コマンドは最も基本的なファイル一覧表示コマンドで、ワイルドカードとの組み合わせで威力を発揮します。
基本的な使い方
特定の拡張子をまとめて表示
# .logファイルをすべて表示
ls *.log
# .txtと.docファイルを表示
ls *.txt *.doc
# 複数拡張子をブレース展開で
ls *.{txt,doc,pdf}
日付パターンのファイル検索
# 2023年のログファイル
ls *2023*.log
# 月別ログファイル(01~12)
ls log_2023-[0-1][0-9].txt
# 特定の日付範囲
ls backup_202[3-4]-*.tar.gz
より詳細な表示オプション
詳細情報付きで表示
# 詳細情報とワイルドカード
ls -l *.conf
# サイズ順でソート
ls -lS *.log
# 更新日時順でソート
ls -lt *.txt
隠しファイルも含めて検索
# 隠しファイルも表示
ls -a .*
# 設定ファイルを検索
ls -la .*.conf
複雑なパターンマッチング
数字を含むファイル名
# file1.log、file2.logのみ
ls file[12].log
# file01.log ~ file99.log
ls file[0-9][0-9].log
# 数字で始まるファイル
ls [0-9]*
文字の組み合わせ
# 大文字で始まるファイル
ls [A-Z]*
# 特定の文字で始まらないファイル
ls [^abc]*
# 英数字で始まるファイル
ls [a-zA-Z0-9]*
注意点:シェルの展開について
ls
に渡すワイルドカードは、シェル(bash)がコマンドを実行する前に展開されます。
実際の動作例
# 入力
ls *.txt
# シェルが展開後、実際に実行されるコマンド
ls file1.txt file2.txt notes.txt
そのため、ls
ではカレントディレクトリ内のファイルのみが対象となり、サブディレクトリを含めた検索はできません。
ls
はカレントディレクトリの簡単なファイル検索に便利です。次はサブディレクトリも含めて探したいときのfind
の使い方を見ていきましょう。
findでワイルドカードを使う
find
コマンドは、ディレクトリを再帰的に検索できる強力なツールです。ワイルドカードを使うことで、複雑な条件でのファイル検索が可能になります。
基本的な使い方
-name
でパターン検索
# /var/log以下のすべての.logファイル
find /var/log -name "*.log"
# カレントディレクトリ以下の.txtファイル
find . -name "*.txt"
# ホームディレクトリの設定ファイル
find ~ -name ".*rc"
-iname
で大文字・小文字を無視
# 大文字小文字を区別しない検索
find . -iname "*.jpg"
# → image.JPG、photo.jpg、Picture.JPEG などにマッチ
# ReadMeファイルを検索
find . -iname "readme*"
# → README.txt、readme.md、ReadMe.rst など
重要:クォートの使い方
シングルクォートで囲む理由
# ❌ 間違い:シェルが展開してしまう
find . -name *.log
# ✅ 正しい:findに直接パターンを渡す
find . -name '*.log'
# ダブルクォートでも可(但し一部例外あり)
find . -name "*.log"
クォートで囲まないと、シェルが先にワイルドカードを展開してしまい、意図しない結果になる場合があります。
高度な検索条件
複数の条件を組み合わせ
# .logまたは.txtファイル
find . \( -name "*.log" -o -name "*.txt" \)
# 特定のディレクトリを除外
find . -name "*.py" ! -path "./venv/*"
# ファイルサイズも考慮
find . -name "*.log" -size +10M
ファイルタイプの指定
# ファイルのみ(ディレクトリを除外)
find . -type f -name "*.conf"
# ディレクトリのみ
find . -type d -name "*backup*"
# シンボリックリンクのみ
find . -type l -name "*"
日時条件との組み合わせ
# 7日以内に変更されたlogファイル
find . -name "*.log" -mtime -7
# 1年以上古いバックアップファイル
find /backup -name "*.tar.gz" -mtime +365
# 今日作成されたファイル
find . -name "*" -newermt "today"
実用的な検索例
ログファイルの管理
# 古いログファイルを検索
find /var/log -name "*.log.*" -mtime +30
# 大きなログファイルを検索
find /var/log -name "*.log" -size +100M
# 特定パターンのログファイル
find . -name "error_[0-9][0-9][0-9][0-9]*"
開発環境での検索
# Pythonファイル(__pycache__を除外)
find . -name "*.py" ! -path "*/__pycache__/*"
# 設定ファイルの検索
find /etc -name "*.conf" -o -name "*.cfg"
# 一時ファイルの検索
find /tmp -name ".*" -o -name "*~" -o -name "*.tmp"
findの結果を活用する
ファイルに対してコマンド実行
# 見つかったファイルを詳細表示
find . -name "*.log" -exec ls -l {} \;
# 見つかったファイルを削除(注意!)
find . -name "*.tmp" -exec rm {} \;
# より安全な削除(確認付き)
find . -name "*.tmp" -exec rm -i {} \;
find
を使えばサブディレクトリも含めた広範囲の検索が可能です。次は、ファイル名だけでなくファイルの中身をパターンで探す方法を紹介します。
grepとワイルドカードを組み合わせる
grep
コマンドは、ファイルの中身からテキストパターンを検索するツールです。ワイルドカードと組み合わせることで、特定のファイル群から効率的に情報を抽出できます。
grepの基本とワイルドカード
grepのパターンは正規表現 grep
自体は正規表現を使いますが、ファイル指定にワイルドカードを使えます。
# カレントディレクトリの.logファイルから"error"を検索
grep "error" *.log
# .txtファイルから特定の文字列を検索
grep "TODO" *.txt
# 複数拡張子から検索
grep "function" *.{js,py,php}
実用的な検索パターン
ログファイルの解析
# エラーメッセージの検索
grep -i "error" *.log
# 特定の日付のログ
grep "2023-12-25" /var/log/*.log
# IPアドレスの検索
grep -E "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" *.log
設定ファイルの検索
# コメントアウトされていない設定
grep -v "^#" *.conf
# 特定の設定項目
grep "port" *.cfg
# 空行を除いた表示
grep -v "^$" *.txt
grepの便利なオプション
表示形式の改善
# 行番号付きで表示
grep -n "error" *.log
# ファイル名のみ表示
grep -l "error" *.log
# マッチした行の前後も表示
grep -C 3 "error" *.log # 前後3行
grep -A 2 "error" *.log # 後2行
grep -B 2 "error" *.log # 前2行
検索の精度向上
# 大文字小文字を無視
grep -i "Error" *.log
# 単語境界を意識した検索
grep -w "test" *.txt
# 正規表現を使用
grep -E "error|warning|fatal" *.log
findとgrepの組み合わせ
最も強力なのは、find
でファイルを絞り込んでからgrep
で中身を検索する方法です。
基本的な組み合わせ
# すべてのサブディレクトリの.logファイルから検索
find . -name "*.log" -exec grep "error" {} \;
# ファイル名も表示
find . -name "*.log" -exec grep -H "error" {} \;
# より読みやすい形式
find . -name "*.log" -exec grep -l "error" {} \;
パイプを使った組み合わせ
# xargsを使用(推奨)
find . -name "*.log" | xargs grep "error"
# ファイル名にスペースがある場合
find . -name "*.log" -print0 | xargs -0 grep "error"
複雑な条件での検索
# 特定期間のログファイルから検索
find /var/log -name "*.log" -mtime -7 -exec grep "error" {} \;
# 大きなファイルを除外して検索
find . -name "*.txt" -size -1M -exec grep "TODO" {} \;
# 特定ディレクトリを除外
find . -name "*.py" ! -path "./venv/*" -exec grep "import" {} \;
高度なgrep活用
正規表現との組み合わせ
# IPアドレスの抽出
grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" *.log
# メールアドレスの検索
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" *.txt
# 日付形式の検索
grep -E "[0-9]{4}-[0-9]{2}-[0-9]{2}" *.log
統計情報の取得
# マッチ行数のカウント
grep -c "error" *.log
# マッチしたファイル数
grep -l "error" *.log | wc -l
# パターン別の集計
grep -o "error\|warning\|info" *.log | sort | uniq -c
実践的なワイルドカード活用例
システム管理での活用
ログ管理
# 今日のログファイルを検索
ls /var/log/*$(date +%Y%m%d)*
# 古いログファイルのアーカイブ
find /var/log -name "*.log.[0-9]*" -mtime +30
# エラーログの監視
grep -i "error\|critical\|fatal" /var/log/*.log
バックアップファイルの管理
# バックアップファイルの一覧
find /backup -name "*.tar.gz" -mtime -7
# 古いバックアップの削除対象
find /backup -name "backup_20??_*.tar.gz" -mtime +90
# バックアップサイズの確認
ls -lh /backup/*.{tar.gz,zip}
開発作業での活用
ソースコード管理
# TODOコメントの検索
find . -name "*.{py,js,php}" -exec grep -n "TODO\|FIXME" {} +
# 未使用ファイルの検索
find . -name "*.bak" -o -name "*~" -o -name "*.swp"
# 特定の関数の使用箇所
grep -r "function_name" --include="*.py" .
設定ファイルの管理
# 設定ファイルのバックアップ
cp /etc/*.conf /backup/config/
# 変更された設定ファイル
find /etc -name "*.conf" -mtime -1
# 設定値の確認
grep -v "^#\|^$" /etc/*.conf
よくある問題と対処法
ワイルドカードが期待通りに動作しない
問題:ファイルが見つからない
# ❌ クォートを忘れる
find . -name *.log
# ✅ 正しい書き方
find . -name "*.log"
問題:隠しファイルが検索されない
# 隠しファイルも含める場合
ls .* # 隠しファイルのみ
ls * .* # 通常ファイル + 隠しファイル
大量のファイルでの性能問題
問題:検索が遅い
# ❌ 非効率な検索
find / -name "*.log"
# ✅ 検索範囲を限定
find /var/log /home/user/logs -name "*.log"
# ✅ 検索条件を追加
find /var/log -name "*.log" -mtime -7
特殊文字を含むファイル名
問題:スペースや特殊文字
# スペースを含むファイル名
find . -name "* *" -print0 | xargs -0 ls -l
# 特殊文字をエスケープ
ls file\[1\].txt
ls "file[1].txt"
より高度なテクニック
シェルオプションの活用
globstarオプション(bash 4.0以降)
# globstarを有効化
shopt -s globstar
# すべてのサブディレクトリの.pyファイル
ls **/*.py
# 特定の深さまで検索
ls */*/*.conf
nullglobオプション
# マッチしないパターンで空文字列を返す
shopt -s nullglob
ls *.nonexistent # エラーにならない
複雑なパターンの組み合わせ
複数条件の組み合わせ
# 複数の拡張子と除外パターン
find . \( -name "*.py" -o -name "*.js" \) ! -name "*test*"
# 日付とサイズの組み合わせ
find . -name "*.log" -mtime -7 -size +1M
# ユーザーとパーミッションの組み合わせ
find /home -name "*.txt" -user john -perm 644
まとめ:ワイルドカードを使いこなそう
Linuxでファイル検索にワイルドカードを使うポイントをまとめると:
基本的なワイルドカード
*
:任意の文字列(0文字以上)?
:任意の1文字[]
:指定した文字のいずれか{}
:複数パターンの同時指定
コマンド別の使い分け
ls
:カレントディレクトリの簡単な検索find
:再帰的な検索、複雑な条件指定grep
:ファイル内容の検索(ファイル指定にワイルドカード)
実践的なポイント
- クォート:findではワイルドカードをクォートで囲む
- 組み合わせ:find + grep で最強の検索
- オプション:-iname、-size、-mtimeなどで条件を細かく指定
よくある使用例
# 日常的なファイル管理
ls *.{txt,doc,pdf} # 複数拡張子
find . -name "*.log" -mtime -7 # 最近のログ
grep -r "error" --include="*.log" . # エラー検索
# システム管理
find /var/log -name "*.log.*" -mtime +30 # 古いログ
grep -i "failed\|error" /var/log/*.log # システムエラー
コメント