find -exec で bash を呼び出す
内容までチェックするような、凝ったファイル検査をしたいときに、-exec
節を使いたい。
そういうときは bash
の引数として _
と {}
を渡せばよいようだ。
_
は $0
に埋め込ませるだけである。
$ touch empty.txt $ seq 10 > num1.txt $ seq 4 > num2.txt $ find . -type f -exec bash -c \ 'test $({ echo 0; cat "$1"; } | paste -sd+ - | bc) -eq 10' _ {} \; \ -print ./num2.txt
SVN 作業コピーのダイエットをした
プロジェクトの作業コピーの中にはもう使わないものも含まれている。 そういうファイルが何年も溜まってくると更新するだけでもディスク待ちが発生してしまう。
svn delete
すればいいんだろうけど、プロジェクト的にはそういう感じでもないので、作業コピーに絞ってダイエットをするスクリプトを書いた。「もう使わない」の定義はリビジョン番号で決めた。
$ find path/to/many/files -mindepth 1 -maxdepth 1 -type d | xargs -n1 -I% bash -c 'REV=$(LC_ALL=en_US.UTF8 svn info % | grep -F "Last Changed Rev" | grep -o "[0-9]*"); test "${REV}" -lt 100000 && echo %' | xargs -n1 -I% bash -c 'svn update % --set-depth exclude %; sleep 3'
find
の -exec
内でリビジョンチェックをするつもりがうまくいかなかったので次の xargs
でチェックしている。