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