macOSで学ぶfind・grepの基本テクニック・実用例

findやgrepは、macOSのターミナルで利用される基本的なシェルコマンドです。その利用例を解説しつつ、それらを組み合わせた実用例もご紹介します。この記事では、文字列検索やファイル検索の基本技術から実用例までを簡潔にまとめました。

findでファイル検索

特定のディレクトリ下をファイル名で検索

特定の文字列を含むファイルを検索する例です。

zsh
find [ターゲットディレクトリ] -name '[ファイル名の文字列]'

例:

zsh
find . -name '*arduino*'
find . -name 'arduino-yogurt-maker*'

最近更新されたファイルを検索

更新から少ししか経過していないファイルを検索します。

zsh
find . -type f -mmin -10

findとmvで一括移動

特定のファイルを検索して削除する例です。

zsh
find . -name 'IMG*' | xargs -I% mv -f % ~/.Trash

指定されたサイズ以上のファイルを検索

指定ディレクトリ内のファイルを再帰的に検査します。

zsh
find /path/to/directory -size +1M

カレントディレクトリ内で、特定の拡張子を除外し、詳細情報を表示したい場合:

zsh
find . -size +1M -not -name "*.gif" -exec ls -lh {} + | sort -k 5 -n

応用: 画像を一括リサイズする

bash
#!/bin/bash

# ディレクトリ、サイズ制限(バイト単位)、リサイズ後の最大幅または高さを指定
TARGET_DIRECTORY="."
SIZE_LIMIT=2000000  # 2MBを超えるファイルを検索
MAX_DIMENSION=1500  # 最大幅または高さ

# 指定されたディレクトリ以下のjpg, jpeg, JPEG, pngファイルを検索し、それぞれに対して処理
find "$TARGET_DIRECTORY" \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.PNG' \) -print0 | while IFS= read -r -d $'\0' file; do
    # ファイルサイズを取得
    filesize=$(stat -f%z "$file")
    
    # ファイルサイズが指定サイズを超える場合、リサイズ
    if [ $filesize -gt $SIZE_LIMIT ]; then
        echo "Resizing $filesize $file..."
        sips -Z $MAX_DIMENSION "$file" --out "$file"
    fi
done

echo "Done."

このスクリプトは画像を上書きするので、実行前には必ずバックアップを取ってください。

grepで文字列検索

grepは、ファイルの中身をキーワードで検索するためのコマンドです。下記は基本の実用例です。

ディレクトリ内を再帰的に検索

特定キーワードを含むファイルを検索します。

zsh
grep -lr {キーワード} {\起点ディレクトリ}

例:

zsh
grep -lr 'Flutter' .

オプションの意味

オプション意味
-n (--line-number)検索結果に行番号を表示
-l (--files-with-matches)検索結果にファイル名のみを表示
-r (--recursive)ディレクトリ下のファイルを再帰的に読み取る

指定した拡張子をターゲットにしたい

特定拡張子のファイルのみを検索します。

zsh
grep -lr 'Flutter' . --include='*.md'

他コマンドとの組み合わせ例

ls + grepでディレクトリのみ表示

ls コマンドの結果から、grep を使用してディレクトリのみを表示します。
zsh
ls -al | grep ^d

cat + grepで文字列が含まれる行を検索

特定文字列を含む行のみを表示します。

zsh
cat hoge.txt | grep 'hello'

特定の文字列を含む行以外を表示

zsh
sudo cat /var/log/nginx/error.log.1 | grep -v github.css

マッチした行から数行表示させたい

grep で一致した箇所から指定の行数を表示させるには、grep-A オプション(After)を使うと便利です。以下のように実行してください:
zsh
grep "マッチング文字列"  something.txt -A 行数

例えば、5行を表示させたい場合は:

zsh
grep "マッチング文字列"  something.txt -A 5

関連記事

 
最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

Python学習にオススメの本をご紹介!
Pandasでデータサイエンスはじめよう!
スクレイピングにオススメの書籍

▼ Beautiful Soup4を使ったWebクローリングをはじめ、表データをpandasやOpenPyXL、matplotでデータ解析、グラフ表示などのスクレイピングのやり方が分かりやすく説明されてます。図解が多いのでPython初心者の方でも読み進められる内容となってます。