• ベストアンサー

リダイレクト >> を複数のファイルに同時に行いたい

cat A.txt >> B.txt とコマンドを実行することで、B.txtの末尾にA.txtが挿入されると思います。 これを利用して、複数のファイル(拡張子がtxt)全てにA.txtの内容を挿入させたいのですが、その場合はどういったコマンドを打てばいいのでしょうか? 何か、ディレクトリの中のファイル全てに対して再帰的に処理を施す、という方法がありましたら、お教えください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

findの「-exec」に指定するコマンドには制限があるので、findだけではダメなような気がします。 「/tmp/testdir」以下にあるすべてのファイルに「/tmp/A.txt」の内容を 追加するコマンドは以下のようになります。、 >find /tmp/testdir -type f -name \*.txt -exec echo 'cat /tmp/A.txt >> {}' \; | sh - findコマンドでテンポラリのシェルスクリプトを作ってから、 それをパイプでシェルに渡すしくみになっています。 後ろの「| sh -」を取り除いて実行すると、シェルに渡しているシェルスクリプトが表示されます。

labo_m
質問者

お礼

ご回答、ありがとうございます。 理想通りの形で追記が出来ました!

その他の回答 (3)

  • tthe_mine
  • ベストアンサー率46% (19/41)
回答No.4

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 とすると思います。

labo_m
質問者

お礼

なるほど。そのようになっているわけですか。確かに、私のコマンドを実行すると新たに{}というファイルが作成されてしまいました。 No3の人のやり方で、何とかなったみたいです。 色々と説明していただき、ありがとうございました。

  • golgo20
  • ベストアンサー率42% (3/7)
回答No.2

まず >find -name '*.txt' -exec cat test.txt >> {} \; findの次はpathを書かないと駄目です。

labo_m
質問者

お礼

そのようですね。 パスを書かなくても、何とかなったので…… ご指摘、ありがとうございました。

  • golgo20
  • ベストアンサー率42% (3/7)
回答No.1

一行で実行しようとすると難しいと思うので 下記のようなスクリプトを設けて実行したらどうでしょうか。 拡張子が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が挿入されているはずです。

labo_m
質問者

お礼

このやり方も便利そうですね。 シェルでやる必要が出たとき、参考にさせていただきます。 ご回答、ありがとうございました。

labo_m
質問者

補足

処理したいファイルは大量にある上にいくつかのディレクトリにばらけているので、ちょっとリストを作っていくのは手間です。だから、コマンドを利用したかったのですが・・・・・・ findコマンドを利用できればと思ったのですが、 find -name '*.txt' -exec cat test.txt >> {} \; としても、上手くいきません({}というファイルが作成されてしまいます) findはこの場合、利用できないのでしょうか?

関連するQ&A