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

はじめに
findやgrepは、macOSのターミナルで利用される基本的なシェルコマンドです。その利用例を解説しつつ、それらを組み合わせた実用例もご紹介します。この記事では、文字列検索やファイル検索の基本技術から実用例までを簡潔にまとめました。
find 特定のディレクトリ下をファイル名で検索
特定の文字列を含むファイルを検索する例です。
find [ターゲットディレクトリ] -name '[ファイル名の文字列]'
例:
find . -name '*arduino*'
find . -name 'arduino-yogurt-maker*'
最近更新されたファイルを検索
更新から少ししか経過していないファイルを検索します。
find . -type f -mmin -10
findとmvで一括移動
特定のファイルを検索して削除する例です。
find . -name 'IMG*' | xargs -I% mv -f % ~/.Trash
find 指定されたサイズ以上のファイルを検索
指定ディレクトリ内のファイルを再帰的に検査します。
find /path/to/directory -size +1M
カレントディレクトリ内で、特定の拡張子を除外し、詳細情報を表示したい場合:
find . -size +1M -not -name "*.gif" -exec ls -lh {} + | sort -k 5 -n
find 応用: 画像を一括リサイズする
#!/bin/bash
TARGET_DIRECTORY="."
SIZE_LIMIT=2000000 # 2MBを超えるファイルを検索
MAX_DIMENSION=1500 # 最大幅または高さ
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."
このスクリプトは画像を上書きするので、実行前には必ずバックアップを取ってください。
find でファイルを更新する
fswatch
などのファイルウォッチツールでイベントを監視している場合、find
と組み合わせて touch
を使うことで、任意のファイル更新イベントをトリガーできて便利です。
find . -type f -name "*.yml" -exec touch {} +
grep ディレクトリ内を再帰的に検索

grepは、ファイルの中身をキーワードで検索するためのコマンドです。下記は基本の実用例です。
特定キーワードを含むファイルを検索します。
grep -lr {キーワード} {\起点ディレクトリ}
例:
grep -lr 'Flutter' .
オプションの意味
オプション | 意味 |
---|---|
-n (–line-number) | 検索結果に行番号を表示 |
-l (–files-with-matches) | 検索結果にファイル名のみを表示 |
-r (–recursive) | ディレクトリ下のファイルを再帰的に読み取る |
指定した拡張子をターゲットにしたい
特定拡張子のファイルのみを検索します。
grep -lr 'Flutter' . --include='*.md'
ls + grepでディレクトリのみ表示
ls
コマンドの結果から、grep
を使用してディレクトリのみを表示します。
ls -al | grep ^d
cat + grepで文字列が含まれる行を検索
特定文字列を含む行のみを表示します。
cat hoge.txt | grep 'hello'
特定の文字列を含む行以外を表示
sudo cat /var/log/nginx/error.log.1 | grep -v github.css
grep マッチした行から数行表示させたい
grep
で一致した箇所から指定の行数を表示させるには、grep
と -A
オプション(After)を使うと便利です。以下のように実行してください:
grep "マッチング文字列" something.txt -A 行数
例えば、5行を表示させたい場合は:
grep "マッチング文字列" something.txt -A 5
関連記事
- diff(colordiff)|シェル
- ls・tree・sort・uniq コマンドの使い方
- iconvコマンドでエンコーディング変換 macOS/Linux/Unix
- less|シェル
- tarコマンドでmacOSのバックアップする方法