いろいろやりかたがあると思いますが、私は while read
を使っちゃいますかね。やりたいことが複雑になってきても応用が利くので。
$ find /home/kaihatsu/user -type f | grep -v 除外1 | grep -v t除外2 | while read f; do mv $f /tmp/$$.tmp; sed s/置換前/置換後/g < $$.tmp > $f; done
置換しないもののタイムスタンプや i node を保存するなら grep -v 除外1
の前に grep 置換前 |
を挟むといいかもしれません。
追記
「;」は複数の文を一行に書くことができるもので、
echo 1
echo 2
echo 3
```を
echo 1; echo 2; echo 3
「`while` ~ `do` ~ `done`」は、
while command
do
...
done
```は command
が実行成功している間、do
から done
の間の文を繰り返し実行します。
追記、その2
こういうコマンドを組み立てるときの私のやり方です。いきなり作り上げるのは難しいので、シェルのコマンドヒストリ機能を使って徐々に作り上げていきます。
まずは、
$ find /home/kaihatsu/user -type f | head
$ find /home/kaihatsu/user -type f | grep -v 除外1 | head
$ find /home/kaihatsu/user -type f | grep -v 除外1 | grep -v t除外2 | head
```などとやっていきます。最後に `head` をつけているのは全部リスティングされると多すぎるのを抑制するためです。次に、`whil read` を付け加えてみます。
$ find /home/kaihatsu/user -type f | grep -v 除外1 | grep -v t除外2 | head | while read f; do echo $f; done
```望みのコマンドになりそうか、まずは echo
をつけておきながら実行します。
$ find /home/kaihatsu/user -type f | grep -v 除外1 | grep -v t除外2 | head | while read f; do echo mv $f /tmp/$$.tmp; echo sed s/置換前/置換後/g $$.tmp $f; done
```ここにくるまではいろいろ試行錯誤することが多いです。
最後に `head` と `echo` を外し、実行します。
他にもいろいろなパターンや技がありますが、基本的にはこんな感じでやります。