Linuxでファイル名を部分一致で検索する方法|findやlsでサクッと探す!

Linux

Linuxサーバーや開発環境で作業していると
「ファイル名にconfigが含まれているファイルを探したい」
2025が名前に入ったログファイルだけ一覧にしたい」
そんな場面はよくあります。

実際に多くの場面でファイルの部分一致検索が必要になります:

「設定ファイルをまとめて確認したい」
「特定の日付のログファイルを一括処理したい」
「プロジェクト名が含まれるファイルを整理したい」
「バックアップファイルを見つけて削除したい」
「開発中のソースコードファイルを素早く検索したい」

この記事では、Linuxでファイル名を部分一致で検索する様々な方法から、効率的な検索テクニック、実用的な活用例まで、初心者の方にもわかりやすく解説します。

スポンサーリンク

ファイル検索の基本概念

ワイルドカードとパターンマッチング

ワイルドカード文字の種類

文字意味マッチする例
*0文字以上の任意の文字*.txtfile.txt, document.txt
?1文字の任意の文字file?.txtfile1.txt, fileA.txt
[]角括弧内のいずれかの文字file[123].txtfile1.txt, file2.txt
[!]角括弧内以外の文字file[!0-9].txtfileA.txt, fileX.txt

大文字・小文字の扱い

Linux/Unixの特徴

  • デフォルトで大文字・小文字を区別(Case Sensitive)
  • config.txtConfig.txtは別のファイル
  • 検索時も明示的に指定しない限り区別される

実用的な影響

  • Windows環境から移行時の注意点
  • 設定ファイルの命名規則との関係
  • スクリプト作成時の考慮事項

findコマンドを使った部分一致検索

基本的な使用方法

最もシンプルな検索

find . -name "*config*"

このコマンドの構成要素:

  • .:検索開始ディレクトリ(現在のディレクトリ)
  • -name:ファイル名で検索
  • "*config*":configを含む任意のファイル名

実行結果例

./etc/nginx.conf
./config/database.yaml
./app_config.json
./backup/old_config.bak
./logs/config_2023.log

大文字・小文字を無視した検索

-inameオプションの使用

find . -iname "*config*"

検索される例

  • config.txt
  • Config.ini
  • CONFIGURATION.xml
  • MyConfig.json
  • app_CONFIG_dev.yaml

実用性

  • 複数人での開発環境
  • 異なるOS間でのファイル共有
  • 命名規則が統一されていない環境

ファイルタイプによる絞り込み

ファイルのみを検索

find . -type f -name "*config*"

ディレクトリのみを検索

find . -type d -name "*config*"

その他のファイルタイプ

# シンボリックリンクのみ
find . -type l -name "*config*"

# 実行可能ファイルのみ
find . -type f -executable -name "*config*"

# 特定の権限を持つファイル
find . -type f -perm 644 -name "*config*"

検索範囲の指定

特定のディレクトリから検索

find /etc -name "*config*"
find /var/log -name "*2023*"
find /home/user -name "*backup*"

複数のディレクトリを同時検索

find /etc /var/log /opt -name "*config*"

最大検索深度の制限

# 現在のディレクトリのみ(サブディレクトリは検索しない)
find . -maxdepth 1 -name "*config*"

# 2階層まで検索
find . -maxdepth 2 -name "*config*"

拡張子と組み合わせた検索

特定の拡張子のみ

# .confファイルでconfigを含むもの
find . -name "*config*.conf"

# .txtまたは.logファイル
find . \( -name "*.txt" -o -name "*.log" \) -name "*config*"

# 複数拡張子の指定
find . -name "*config*" \( -name "*.yaml" -o -name "*.yml" -o -name "*.json" \)

lsコマンドを使った簡易検索

現在ディレクトリでの検索

基本的なワイルドカード使用

ls *config*

出力結果の制御

# 詳細表示
ls -la *config*

# ファイルサイズ順
ls -lS *config*

# 更新時刻順
ls -lt *config*

パターンの組み合わせ

複数パターンの同時検索

# configまたはlogを含むファイル
ls *config* *log*

# 特定の拡張子と組み合わせ
ls *.conf *config*.txt

# 年月日パターン
ls *2023* *2024*

除外パターン

# .bakファイル以外
ls !(*.bak)

# 特定のパターンを除外(bash拡張glob)
shopt -s extglob
ls !(backup_*)

lsの制限事項

サブディレクトリの検索不可

  • lsは現在のディレクトリのみが対象
  • 再帰的な検索には不適切
  • 大量のファイルがある場合の性能問題

代替手段

# 再帰的な検索が必要な場合
find . -name "*config*" -exec ls -la {} \;

grepを組み合わせた柔軟な検索

findとgrepの組み合わせ

基本的な組み合わせ

find . | grep config

より複雑なパターン

# 複数の条件を組み合わせ
find . | grep -E "(config|setting|preferences)"

# 大文字小文字を無視
find . | grep -i config

# 特定の拡張子のみ
find . -name "*.txt" | grep config

lsとgrepの組み合わせ

現在ディレクトリでの絞り込み

ls | grep config
ls -la | grep config

日付や時刻での絞り込み

# 特定の月のファイル
ls -la | grep "Mar.*config"

# 特定の年
ls -la | grep "2023.*config"

高度なgrep検索

正規表現の活用

# 数字が含まれるconfigファイル
find . | grep -E "config.*[0-9]"

# 特定のプレフィックス・サフィックス
find . | grep -E "(test|dev|prod)_config"

# 複数の条件を満たすファイル
find . | grep config | grep -v backup

正規表現を使った高度な検索

findの-regexオプション

基本的な正規表現検索

find . -regex ".*config.*"

より複雑なパターン

# 特定の形式のファイル名
find . -regex ".*config_[0-9]{4}-[0-9]{2}-[0-9]{2}.*"

# 複数の拡張子を持つconfigファイル
find . -regex ".*config.*\.(conf|cfg|ini|yaml|json)$"

正規表現の種類指定

POSIX拡張正規表現の使用

find . -regextype posix-extended -regex ".*config_(dev|test|prod).*"

Perl互換正規表現(一部環境)

find . -regextype pcre -regex ".*config(?:_backup)?.*"

実用的な正規表現パターン

日付形式のファイル検索

# YYYY-MM-DD形式
find . -regextype posix-extended -regex ".*[0-9]{4}-[0-9]{2}-[0-9]{2}.*"

# YYYYMMDD形式
find . -regextype posix-extended -regex ".*[0-9]{8}.*"

バージョン番号を含むファイル

# v1.2.3形式
find . -regextype posix-extended -regex ".*v[0-9]+\.[0-9]+\.[0-9]+.*"

実用的な検索パターン

設定ファイルの一括検索

一般的な設定ファイル

# 設定ファイル名パターン
find . -name "*config*" -o -name "*conf*" -o -name "*.ini" -o -name "*.cfg"

# システム設定ファイル
find /etc -name "*config*" -o -name "*.conf" 2>/dev/null

# ユーザー設定ファイル
find ~ -name ".*config*" -o -name ".*rc"

ログファイルの検索

時期別ログファイル

# 2023年のログ
find /var/log -name "*2023*" -name "*.log"

# 今月のログ(動的生成)
CURRENT_MONTH=$(date +%Y-%m)
find /var/log -name "*${CURRENT_MONTH}*"

# アプリケーション別ログ
find /var/log -name "*apache*" -o -name "*nginx*" -o -name "*mysql*"

開発プロジェクトでの検索

ソースコードファイル

# 特定の機能に関連するファイル
find . -name "*auth*" \( -name "*.py" -o -name "*.js" -o -name "*.java" \)

# テストファイル
find . -name "*test*" -o -name "*spec*"

# 設定・環境ファイル
find . -name ".env*" -o -name "*config*" -o -name "*.yaml" | grep -v node_modules

バックアップファイルの管理

バックアップファイルの検索

# 一般的なバックアップパターン
find . -name "*.bak" -o -name "*.backup" -o -name "*~"

# 日付付きバックアップ
find . -name "*backup*" | grep -E "[0-9]{4}-[0-9]{2}-[0-9]{2}"

# 古いバックアップファイル(7日以上前)
find . -name "*backup*" -mtime +7

パフォーマンスの最適化

検索範囲の限定

不要なディレクトリの除外

# 特定のディレクトリを除外
find . -path "./node_modules" -prune -o -name "*config*" -print
find . -path "./.git" -prune -o -name "*config*" -print

# 複数ディレクトリの除外
find . \( -path "./node_modules" -o -path "./.git" -o -path "./vendor" \) -prune -o -name "*config*" -print

locateデータベースの活用

locateコマンドの使用

# データベースの更新(管理者権限必要)
sudo updatedb

# 高速検索
locate config
locate "*config*"

# 大文字小文字を無視
locate -i config

locateの制限事項

  • データベースの更新頻度に依存
  • 新しく作成されたファイルは検索されない場合がある
  • システム全体が対象(権限で制限される)

効率的な検索戦略

段階的な絞り込み

# 1. 大まかな検索
find /var -name "*log*" -type f

# 2. 結果を絞り込み
find /var -name "*log*" -type f | grep error

# 3. さらに詳細条件
find /var -name "*error*log*" -type f -mtime -7

エラー処理とトラブルシューティング

よくあるエラーと対処法

Permission Denied エラー

# エラーメッセージを非表示
find / -name "*config*" 2>/dev/null

# 権限のあるディレクトリのみ検索
find / -name "*config*" 2>/dev/null | head -20

# sudo を使用(必要な場合のみ)
sudo find /root -name "*config*"

引数が長すぎるエラー

# 結果が多すぎる場合の対処
find . -name "*config*" | head -50

# ページング
find . -name "*config*" | less

# ファイルに出力
find . -name "*config*" > search_results.txt

デバッグとテスト

検索条件のテスト

# dry-run的な確認
find . -name "*config*" -print

# 詳細な実行ログ
find . -name "*config*" -print0 | xargs -0 ls -la

結果の検証

# 件数の確認
find . -name "*config*" | wc -l

# ファイルサイズの合計
find . -name "*config*" -exec du -ch {} + | tail -1

自動化とスクリプト化

検索スクリプトの例

汎用的な検索スクリプト

#!/bin/bash
# file_search.sh - ファイル名部分一致検索スクリプト

function usage() {
    echo "Usage: $0 [-d directory] [-t type] [-i] pattern"
    echo "  -d: 検索ディレクトリ (default: .)"
    echo "  -t: ファイルタイプ (f:file, d:directory)"
    echo "  -i: 大文字小文字を無視"
    exit 1
}

# デフォルト値
SEARCH_DIR="."
FILE_TYPE=""
IGNORE_CASE=""
PATTERN=""

# オプション解析
while getopts "d:t:i" opt; do
    case $opt in
        d) SEARCH_DIR="$OPTARG" ;;
        t) FILE_TYPE="-type $OPTARG" ;;
        i) IGNORE_CASE="-i" ;;
        *) usage ;;
    esac
done

shift $((OPTIND-1))
PATTERN="$1"

if [ -z "$PATTERN" ]; then
    usage
fi

# 検索実行
if [ -n "$IGNORE_CASE" ]; then
    find "$SEARCH_DIR" $FILE_TYPE -iname "*$PATTERN*"
else
    find "$SEARCH_DIR" $FILE_TYPE -name "*$PATTERN*"
fi

設定ファイル検索の自動化

設定ファイル一括チェックスクリプト

#!/bin/bash
# config_finder.sh - 設定ファイル検索・検証

CONFIG_PATTERNS=("*config*" "*.conf" "*.cfg" "*.ini" "*.yaml" "*.yml" "*.json")
SEARCH_DIRS=("/etc" "/opt" "/usr/local/etc")

echo "=== 設定ファイル検索結果 ==="

for dir in "${SEARCH_DIRS[@]}"; do
    if [ -d "$dir" ]; then
        echo "--- $dir ---"
        for pattern in "${CONFIG_PATTERNS[@]}"; do
            find "$dir" -name "$pattern" -type f 2>/dev/null | head -10
        done
        echo
    fi
done

# ユーザーディレクトリの設定ファイル
echo "--- ユーザー設定ファイル ---"
find ~ -name ".*config*" -o -name ".*rc" 2>/dev/null | head -20

まとめ

Linuxファイル名部分一致検索の要点

コマンド適用範囲特徴推奨度
find . -name "*文字列*"再帰的最も汎用的★★★
ls *文字列*現在ディレクトリ簡単・高速★★★
find . | grep 文字列再帰的柔軟な絞り込み★★
locate *文字列*システム全体高速(要DB更新)★★

効率的な検索のポイント

  • 基本的な検索find-nameオプションをメインに使用
  • 大文字小文字の区別-inameで柔軟な検索
  • ファイルタイプ指定-typeで検索対象を絞り込み
  • パフォーマンス:不要なディレクトリの除外で高速化

実用的な活用指針

  • 日常的な検索findlsの使い分け
  • システム管理:設定ファイルやログファイルの効率的な検索
  • 開発作業:プロジェクト内でのファイル検索の自動化
  • バックアップ管理:古いファイルの特定と整理

注意事項

  • 権限エラーの適切な処理
  • 大量の結果が出る場合の対策
  • 正規表現使用時の性能への影響
  • セキュリティを考慮したディレクトリアクセス

コメント

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