xargs でまとめて○○する



UNIX 上である程度ファイルを選別してから別のコマンドにパイプする方法の紹介。

例えば、あるディレクトリの中のHTMLファイルからだけ電話番号が記載されているファイルを抽出するなど。

cd /path/to/dir
grep -r 03-1234-5678 *

としてもいいのだが、これだとディレクトリ内に画像が含まれていたりする場合も全てのファイルに grep を掛けるので効率が悪い。

find . -name "*.html" -type f -exec grep 03-1234-5678 {} \;

としても良いが、これだと1ファイルごとに grep が起動されるので効率が悪い。
と言うことで、

ディレクトリの中のHTMLファイルからだけ電話番号が記載されているファイルを抽出する

find . -name "*.html" -type f | xargs grep 03-1234-5678

この他の使い方

今日追加したファイルだけ csv add する

find . -type f -newerct '00:00 today' | xargs cvs add

1年以上変更していないファイルを cvs remove する

find . -type -f ! -newerct '1 year ago' #確認
find . -type -f ! -newerct '1 year ago' | xargs cvs remove -f

新しいファイル/ディレクトリを cvs add する

cvs -qn update | grep "^\?" | sed -e 's/^\?//g' | xargs cvs add