• ベストアンサー

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

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

  • sedを使って複数ファイルの先頭行を表示

    以下の様なファイルがあります。 各ファイルの先頭行をとりだしたいのですが、headコマンドを使うと ファイル名と結果が分かれて表示されます。 sedで、-nオプションの行番号指定で表示することができるので、 sed -n '1p' *.txt のワイルドカード指定でやったのですが、 この場合だと複数ファイルとみてくれなくて、すべてのファイルを ひとつにしてその先頭を表示しているみたいです。 できれば、各ファイル毎に、ファイル名と結果を1行にして表示したい のですが、どうすればよいでしょうか。 参照ファイル cat 1.txt 12345 67890 cat 2.txt abcde fghij cat 3.txt 11111 22222 headコマンドで実行 $ head -n 1 *.txt ==> 1.txt <== 12345 ==> 2.txt <== abcde ==> 3.txt <== 11111 sedで実行 $ sed -n '1p' *.txt 12345

  • cat でファイルの拡張子を指定

    基本的なことで申し訳ないんですが、 UNIXのcat コマンドでファイルの中身を出力するときに、カレントディレクトリでないファイルを出力するには、パスも書きますよね。 cat パス/ファイル名 catでパスを指定して使うときに、 パスを繰り返し書かないで、 (その指定したディレクトリ直下だけでいいので)複数の特定の拡張子のファイルのみ出力するには、どうすればよいのですか? 例えば、 拡張子が、cとcsとtxtのファイルだけ出力して、その他のファイルは出力しない というようなときです。 既に書いたとおり、パスは繰り返して書かないので、 cat パス/*.c パス/*.cs パス/*.txt のようなものはナシということでお願いします。

  • linuxコマンド/複数のディレクトリに対して一括でファイルをコピー

    linuxコマンドについて質問です。 ある特定の1つのファイルを、複数のディレクトリに対して一括コピーはできなのでしょうか? root La Lb Lc -test.txt ↓実行後 root La-test.txt Lb-test.txt Lc-test.txt -test.txt root以下にあるファイル test.txt(root/test.txt)を root以下にあるディレクトリa,b,cにコピーしたいのです。 よろしくお願いいたします

  • ディレクトリ内の全てのファイルの中身を操作したい

    ディレクトリ内に、例えば10個のテキストファイル a.txt b.txt c.txt d.txt e.txt f.txt g.txt h.txt i.txt j.txt があり、その中身にそれぞれ 2 6 98 65 4 52 98 100 82 56 という数字が書かれているとします。 これらのファイルの中身の平均をawkを用いたコマンドで表示させたいのですが、自分なりに頑張ったのですが実行できませんでした。 (cat * | awk'{BEGIN{total += $0; i += 1}END{print total/i}' のような感じで) どうすれば実行できるのか、よろしければお教えください。

  • ファイルから特定の行を出力したい

    あるファイルの特定の一行だけを取りだすunixの コマンドを教えて下さい。 具体的には cat a.txt 1gyoume 3gyoume 4gyoume 5gyoume 6gyoume 7gyoume 8gyoume といったファイルの末尾からX行目の内容を変数に入れたいのです。 a.txtが8行あると判断して8-X行目でファイルを分割、そのファイル をtailコマンドで末尾1行目だけ出力すると出来そうだと思ってい るのですがもっと簡単な方法はないでしょうか。

  • DOSコマンド COPY(複数ファイルをまとめる)

    DOSコマンドで、複数ファイルをまとめるのに COPYコマンドを使用しています。 まとめたファイル上にコメント文を加えたいのですが どうすればできるのでしょうか? 下記は、a.txtとb.txtをまとめて、c.txtにしています。 copy a.txt + b.txt c.txt だと、 そのままデータがつながってしまい、コメント文を 入れることができません。 [a.txt] aaa [b.txt] bbb  ↓ [c.txt] "Input A.txt" aaa "Input B.txt" bbb

  • shellscriptでfile名の先頭だけ複数変更?

    はじめまして。Debianを使っています。 たぶん素人な質問かと思うんですが、ちょっと手間取ってて困っています。 シェルスクリプトで複数のファイル名の一部を変更したいのです。例えば、 1a.txt,2a.txt,3a.txt,... を 1.txt,2.txt,3.txt,... のような要領です。 以前、ディレクトリ内のJPGファイルの拡張子をJPGからjpgにすべて変換させるときに、for文を使って、 #!/bin/sh for nm in *.JPG; do mv $nm ${nm%.JPG}.jpg; done のようにしたのですが、これとの違いだけでも教えていただけたら幸いです。

  • 特定ディレクトリ以下の複数のフォルダ名とファイル名を一括で連番にするバッチの作成

    特定のフォルダ(ディレクトリ)以下の複数のフォルダ名とファイル名を 一括で連番にしてくれる方法(連番+拡張子のリネーム)を教えてください。 ソフトでは簡単ですが*.bat ファイルで実行するスクリプトを 知りたいので宜しくお願い致します 例えば フォルダ0 ├フォルダ1 │ ├ a.txt │ ├ b.jpg │ └ フォルダ2 │    └c.exe └ フォルダ3   └ d.exe という構造があったとして 000000 ├000001 │ ├ 000000.txt │ ├ 000001.txt │ └ 000000 │    └000000.txt └ 000002   └ 000000.txt この様に特定ディレクトリ以下の複数のフォルダ名とファイル名を連番 (上記は6桁ですが001,002…など3桁などに対応できる)にしたいのです 以下の方法で特定のフォルダ内のファイルを.txtに変更まではできましたが、 特定のフォルダより下層のファイルを.txtに変更はできませんでした。 REN E:\フォルダ\フォルダ\*.* *.txt 上記のスクリプトは特定フォルダにあるファイルは拡張子の変更が出来ますが、 そのフォルダより下層の複数のフォルダ名とファイル名の拡張子の変更をできないので、 *.batファイルで連番+拡張子のリネームを一括でするスクリプトの明記をお願い致します。 ご存知の方、どの様なご意見でも構いませんので ご回答頂けると幸いです。宜しくお願い致します。

  • Winでのバッチ処理

    CygwinもしくはMS-DOSプロンプトで以下のようなことは出来るでしょうか? あるディレクトリ内に.docファイルと.txtファイルが複数あり txtファイルだけを選択して、すべてのtxtファイルに記入されている dogという単語をcatという単語に書きかえる。 上記のような処理を一括して行うことは可能でしょうか? 済みませんがその方法を教えてください。

  • 複数のファイルを結合する.batファイル

    タイトルのとおり、複数のファイルを結合する.batファイルを作ろうと思っています。 元のファイルはlinux(ubuntu)でsplitコマンドで分割しました。 分割したファイルは after-aa,after-ab,after-acの3つです。 なので copy -b after-aa+after-ab+after-ac dekita というバッチファイルを作り、分割したファイルがあるディレクトリで実行したのですが、結合されません。 コマンドプロントで分割ファイルがあるディレクトリに行き、上記のコマンドを試したのですが、 「指定されたファイルが見つかりません」 と出ます。ファイル名は間違ってないし、当該ディレクトリにきちんと分割ファイルがあるのもdirコマンドで確かめています。 なぜファイルが結合できないのでしょうか?どなたか教えてください。