Linuxでワイルドカードを使ったファイル検索|ls・find・grepの便利な使い方

Linux

Linuxでファイルを探すとき、最も手軽に使えるのがワイルドカードです。

*?などを組み合わせるだけで、複雑なファイル名でも簡単にまとめて検索できます。

でも、実はワイルドカードはコマンドによって挙動が少しずつ違い、うまく使い分けると検索がぐっと便利になります。

例えば、以下のような場面でワイルドカードが活躍します。

  • 特定の拡張子のファイルをすべて表示したい
  • 日付が入ったログファイルを検索したい
  • 複数のディレクトリから一気にファイルを探したい
  • ファイル名の一部だけ覚えている場合の検索
  • 大量のファイルから条件に合うものだけを抽出したい

この記事では、Linuxでワイルドカードを使ってファイルを検索する基本から、lsfindgrepでの活用例、実践的なテクニックまでわかりやすく紹介します。

スポンサーリンク

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   # システムエラー

コメント

タイトルとURLをコピーしました