- ベストアンサー
リダイレクト >> を複数のファイルに同時に行いたい
cat A.txt >> B.txt とコマンドを実行することで、B.txtの末尾にA.txtが挿入されると思います。 これを利用して、複数のファイル(拡張子がtxt)全てにA.txtの内容を挿入させたいのですが、その場合はどういったコマンドを打てばいいのでしょうか? 何か、ディレクトリの中のファイル全てに対して再帰的に処理を施す、という方法がありましたら、お教えください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
findの「-exec」に指定するコマンドには制限があるので、findだけではダメなような気がします。 「/tmp/testdir」以下にあるすべてのファイルに「/tmp/A.txt」の内容を 追加するコマンドは以下のようになります。、 >find /tmp/testdir -type f -name \*.txt -exec echo 'cat /tmp/A.txt >> {}' \; | sh - findコマンドでテンポラリのシェルスクリプトを作ってから、 それをパイプでシェルに渡すしくみになっています。 後ろの「| sh -」を取り除いて実行すると、シェルに渡しているシェルスクリプトが表示されます。
その他の回答 (3)
- tthe_mine
- ベストアンサー率46% (19/41)
find . -name '*.txt' -exec cat test.txt >> {} \; ↑これは惜しいですねー。 この文字列をまずは shell が解釈するのですが、>> で区切られてしまいます。 find -name '*.txt' -exec cat test.txt を実行してその結果を {} というファイルに追記してしまいます。 仮に第一引数の内容を第二引数に追加するコマンド append があったとすると、 find . -name '*.txt' -exec append test.txt {} \; でうまく行くと思います。 ひとつの解決策は append コマンドを用意してあげることですね。(そういうコマンドあったっけ?) で、私の場合は for i in `find . -name '*.txt'`; do cat test.txt >> $i done とすると思います。
お礼
なるほど。そのようになっているわけですか。確かに、私のコマンドを実行すると新たに{}というファイルが作成されてしまいました。 No3の人のやり方で、何とかなったみたいです。 色々と説明していただき、ありがとうございました。
- golgo20
- ベストアンサー率42% (3/7)
まず >find -name '*.txt' -exec cat test.txt >> {} \; findの次はpathを書かないと駄目です。
お礼
そのようですね。 パスを書かなくても、何とかなったので…… ご指摘、ありがとうございました。
- golgo20
- ベストアンサー率42% (3/7)
一行で実行しようとすると難しいと思うので 下記のようなスクリプトを設けて実行したらどうでしょうか。 拡張子がtxtのリストを作成し、そのリストをforeachでループさせ 末尾にAAA.txtを挿入するというスクリプトです。 ------------------------------ #! /bin/csh # foreach text ( XXX YYY ZZZ ) cat AAA.txt >> ${text}.txt end ------------------------------ 実行後すると、XXX.txt YYY.txt ZZZ.txt それぞれの末尾にAAA,txtが挿入されているはずです。
お礼
このやり方も便利そうですね。 シェルでやる必要が出たとき、参考にさせていただきます。 ご回答、ありがとうございました。
補足
処理したいファイルは大量にある上にいくつかのディレクトリにばらけているので、ちょっとリストを作っていくのは手間です。だから、コマンドを利用したかったのですが・・・・・・ findコマンドを利用できればと思ったのですが、 find -name '*.txt' -exec cat test.txt >> {} \; としても、上手くいきません({}というファイルが作成されてしまいます) findはこの場合、利用できないのでしょうか?
お礼
ご回答、ありがとうございます。 理想通りの形で追記が出来ました!