Linuxで拡張子を指定してファイルを検索する方法|findやlsで一括チェック

Linux

Linuxで作業していると 「.logファイルだけ探したい」 「.phpのソースファイルをまとめて確認したい」 という場面がよくあります。

そんなとき便利なのが 拡張子を指定してファイルを探す方法 です。

この記事では、Linuxで拡張子ごとにファイルを検索する代表的な方法(find・ls・grep)をわかりやすく紹介します。

スポンサーリンク

拡張子検索が必要な場面

よくあるシチュエーション

ログファイルの管理

  • .log ファイルの一括確認
  • 古いログファイルの削除
  • 特定期間のログファイル抽出

ソースコード管理

  • .php.js.css ファイルの検索
  • バックアップ対象ファイルの選別
  • コードレビューでの対象ファイル特定

設定ファイルの管理

  • .conf.yml.ini ファイルの場所確認
  • 設定変更時の影響範囲調査
  • バックアップ前の設定ファイル確認

マルチメディアファイルの整理

  • 画像ファイル(.jpg.png.gif)の検索
  • 動画ファイル(.mp4.avi.mkv)の管理
  • 音楽ファイル(.mp3.wav.flac)の整理

拡張子検索の利点

効率的なファイル管理

  • 特定の種類のファイルだけを対象にした処理
  • 不要なファイルを除外した効率的な検索
  • ファイルタイプ別の一括操作

ディスク容量の把握

  • 拡張子別のディスク使用量確認
  • 大きなファイルの種類特定
  • 不要ファイルの洗い出し

findコマンドで拡張子検索

基本的な検索方法

基本構文:

find <ディレクトリ> -name "*.拡張子"

重要なポイントは -name の後に "*.拡張子" と書くことです。クォートを忘れると、シェルによる展開が発生して予期しない結果になることがあります。

実例で覚える基本操作

カレントディレクトリで.logファイルを探す:

find . -name "*.log"

システム全体で設定ファイルを探す:

sudo find / -name "*.conf"

特定ディレクトリでPHPファイルを探す:

find /var/www -name "*.php"

ホームディレクトリで画像ファイルを探す:

find ~ -name "*.jpg"

大文字小文字を区別しない検索

-inameオプション:

find . -iname "*.JPG"

これなら以下のファイルをすべて検索できます:

  • image.jpg
  • photo.JPG
  • picture.Jpg
  • sample.jPg

実際の使用例:

# 画像ファイルを大文字小文字関係なく検索
find /home/user/Pictures -iname "*.jpg" -o -iname "*.png" -o -iname "*.gif"

ファイルタイプを限定した検索

通常ファイルのみ検索:

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

ディレクトリは除外:

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

これにより、.conf という名前のディレクトリは除外され、ファイルのみが検索されます。

検索結果の表示形式

詳細情報付きで表示:

find . -name "*.log" -ls

ファイルサイズも表示:

find . -name "*.log" -exec ls -lh {} \;

ファイル数をカウント:

find . -name "*.php" | wc -l

複数の拡張子を同時に検索

OR条件での検索

基本的なOR検索:

find . \( -name "*.jpg" -o -name "*.png" \)

括弧 \(\) でグループ化することで、複数の条件を組み合わせできます。

3つ以上の拡張子:

find . \( -name "*.jpg" -o -name "*.png" -o -name "*.gif" \)

ソースコードファイルの一括検索:

find . \( -name "*.php" -o -name "*.js" -o -name "*.css" \)

より実践的な複数条件検索

Web開発ファイルの検索:

find /var/www \( -name "*.php" -o -name "*.html" -o -name "*.js" -o -name "*.css" \)

設定ファイルの検索:

find /etc \( -name "*.conf" -o -name "*.cfg" -o -name "*.ini" -o -name "*.yml" \)

ログファイルの検索:

find /var/log \( -name "*.log" -o -name "*.err" -o -name "*.out" \)

条件の組み合わせ

拡張子 + 更新日時:

find . -name "*.log" -mtime -7

7日以内に更新された.logファイルを検索

拡張子 + ファイルサイズ:

find . -name "*.mp4" -size +100M

100MB以上の.mp4ファイルを検索

拡張子 + 権限:

find . -name "*.sh" -executable

実行可能な.shファイルを検索

ls コマンドによる簡易検索

シンプルなワイルドカード検索

カレントディレクトリのみ:

ls *.txt
ls *.log
ls *.conf

詳細情報付き:

ls -la *.php

ファイルサイズ順でソート:

ls -lhS *.log

再帰検索との組み合わせ

ls + grep による検索:

ls -R | grep "\.sh$"

注意点: この方法ではファイル名のみが表示され、パス情報が失われます。正確なパスが必要な場合は find を使用してください。

改良版(パス情報を含む):

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

高度な拡張子検索テクニック

正規表現を使った柔軟な検索

複数の数字拡張子:

find . -name "*.[0-9]"

.1.2.log.1 などのファイルを検索

backup拡張子の検索:

find . -name "*.bak" -o -name "*.backup" -o -name "*~"

一時ファイルの検索:

find . -name "*.tmp" -o -name "*.temp" -o -name ".*~"

拡張子に基づくファイル処理

検索結果をファイルに保存:

find . -name "*.log" > logfiles.txt

検索結果に対してコマンド実行:

find . -name "*.tmp" -exec rm {} \;

確認してから削除:

find . -name "*.tmp" -exec rm -i {} \;

検索結果を別ディレクトリにコピー:

find . -name "*.jpg" -exec cp {} /backup/images/ \;

xargsとの組み合わせ

大量ファイルの安全な処理:

find . -name "*.log" | xargs -I{} cp {} /backup/logs/

並列処理による高速化:

find . -name "*.jpg" | xargs -P 4 -I{} convert {} {}.thumbnail.jpg

ファイル名にスペースが含まれる場合:

find . -name "*.mp3" -print0 | xargs -0 -I{} mv {} /music/

拡張子別の容量分析

ディスク使用量の確認

拡張子別のファイル数:

find . -name "*.log" | wc -l

拡張子別の総容量:

find . -name "*.mp4" -exec du -ch {} + | tail -1

拡張子別の詳細容量分析:

find . -name "*.log" -exec du -h {} \; | sort -rh | head -10

容量の大きいファイルの特定

1GB以上のビデオファイル:

find . -name "*.mp4" -size +1G -exec ls -lh {} \;

100MB以上のログファイル:

find /var/log -name "*.log" -size +100M

実用的な活用例

システム管理での活用

古いログファイルの削除:

find /var/log -name "*.log.*" -mtime +30 -delete

設定ファイルのバックアップ:

find /etc -name "*.conf" -exec cp {} /backup/config/ \;

実行可能ファイルの権限確認:

find /usr/bin -name "*.sh" -not -executable

開発作業での活用

ソースコードの行数カウント:

find . -name "*.php" -exec wc -l {} + | tail -1

TODOコメントの検索:

find . -name "*.py" -exec grep -H "TODO" {} \;

未使用ファイルの検索:

find . -name "*.js" -not -path "*/node_modules/*" -mtime +90

マルチメディアファイルの管理

重複画像ファイルの確認:

find . -name "*.jpg" -exec md5sum {} \; | sort | uniq -d -w32

動画ファイルの形式変換準備:

find . -name "*.avi" > convert_list.txt

画像ファイルのサムネイル作成:

find . -name "*.jpg" -exec convert {} -thumbnail 150x150 thumbs/{} \;

トラブルシューティング

よくある問題と解決法

検索結果が表示されない:

# 権限エラーを無視
find / -name "*.conf" 2>/dev/null

# 権限を確認
ls -la /path/to/directory

ワイルドカードが展開されてしまう:

# 正しい方法(クォートを使用)
find . -name "*.txt"

# 間違った方法
find . -name *.txt

拡張子がないファイルの検索:

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

パフォーマンスの最適化

検索範囲の限定:

# 特定ディレクトリを除外
find . -path "./temp" -prune -o -name "*.php" -print

並列処理の活用:

find . -name "*.txt" | xargs -P 4 grep "pattern"

結果のキャッシュ:

# 検索結果を保存
find . -name "*.log" > logfiles_cache.txt

# キャッシュから検索
grep "access" logfiles_cache.txt

便利なスクリプト例

拡張子別ファイル統計

extstat.sh(拡張子別統計スクリプト):

#!/bin/bash
# 拡張子別のファイル数と容量を表示

directory="${1:-.}"
echo "ディレクトリ: $directory"
echo "拡張子 | ファイル数 | 総容量"
echo "-------|-----------|-------"

find "$directory" -type f -name "*.*" | sed 's/.*\.//' | sort | uniq -c | while read count ext; do
    size=$(find "$directory" -name "*.$ext" -exec du -ch {} + 2>/dev/null | tail -1 | cut -f1)
    printf "%-6s | %8d | %s\n" "$ext" "$count" "$size"
done

拡張子別クリーンアップ

cleanup.sh(古いファイルの削除):

#!/bin/bash
# 指定した拡張子の古いファイルを削除

extension="$1"
days="${2:-30}"
directory="${3:-.}"

if [ -z "$extension" ]; then
    echo "使用法: $0 <拡張子> [日数] [ディレクトリ]"
    exit 1
fi

echo "検索対象: $directory"
echo "拡張子: $extension"
echo "削除対象: ${days}日以上前のファイル"

# 削除対象ファイルを表示
files=$(find "$directory" -name "*.$extension" -mtime +$days)
if [ -z "$files" ]; then
    echo "削除対象ファイルはありません。"
    exit 0
fi

echo "削除対象ファイル:"
echo "$files"

read -p "削除しますか? (y/n): " answer
if [ "$answer" = "y" ]; then
    find "$directory" -name "*.$extension" -mtime +$days -delete
    echo "削除完了"
else
    echo "削除をキャンセルしました"
fi

まとめ

重要なポイント

基本的な検索方法:

  • 単一拡張子find . -name "*.拡張子"
  • 大文字小文字無視find . -iname "*.拡張子"
  • 複数拡張子find . \( -name "*.ext1" -o -name "*.ext2" \)
  • 簡易検索ls *.拡張子

実用的なオプション:

  • ファイルタイプ限定-type f
  • 詳細表示-ls
  • サイズ条件-size +100M
  • 日時条件-mtime -7

安全な処理方法:

  • 確認付き削除-exec rm -i {} \;
  • バックアップ作成-exec cp {} /backup/ \;
  • 権限エラー回避2>/dev/null

活用シーン別まとめ

日常的なファイル管理:

  • ログファイルの整理:find /var/log -name "*.log" -mtime +30
  • 一時ファイルの削除:find . -name "*.tmp" -delete
  • バックアップファイルの確認:find . -name "*.bak"

開発作業:

  • ソースコード検索:find . -name "*.php" -o -name "*.js"
  • 設定ファイル確認:find . -name "*.conf" -o -name "*.yml"
  • 実行ファイル検索:find . -name "*.sh" -executable

システム管理:

  • 容量分析:find . -name "*.log" -exec du -h {} \;
  • 権限確認:find . -name "*.conf" -not -perm 644
  • セキュリティ監査:find / -name "*.key" -o -name "*.pem"

コメント

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