たとえばあるディレクトリの中に
text1.txt,text2.txt,text3.text,,,text30.txt
と30のファイルがあったとして、それらのファイルの全ての末尾に”hogehoge”と書き込みたい場合。
わたしはこう書きました
find ./ -type f | xargs -I@ echo "hogehoge" >> @
できたかなーと、ファイルの中をみてみると空でした。
かわりに、@というファイルが増えており、その中に30行のhogehogeが追記されていました。
なんじゃこりゃということで、Linuxマスターに尋ねてみると、どうやら |(パイプ)や >>(追記リダイレクト)の記号はそれの以前と以後でコマンドの影響範囲が異なるという事なんですね。
| xargs -I@ echo "hogehoge" >> @
は正しく認識されておらず、>>を介してしまったために@の置換が上手くいっていなかったということです。
ということで、上でやろうとしたことを正しく実行させるにはこうした方がよさそうです。
for n in $(find ./ -type f); do echo "hogehoge" > $n; done
findをコマンド置換によってforに投げて、1ファイル適宜hogehogeを追記するわけですね〜。
シェルスクリプトをわざわざ書くまでもなく、すっきりしました。
この記事へのコメントはありません。