UNIX: catコマンドで無限ループの原因と対処法

このQ&Aのポイント
  • catコマンドを使用してテキストファイルを追記しようとすると、無限ループになり巨大なファイルが生成される現象が起こります。
  • この現象は、catコマンドによってファイルの内容を表示する際に、その内容を再度ファイルに追記しようとするためです。
  • この問題を解決するには、catコマンドの代わりにテキストエディタを使用し、コピー&ペーストによってファイルを追記する方法を取ると良いでしょう。
回答を見る
  • ベストアンサー

UNIX: catコマンドで無限ループ???

正確にはOS X 10.9.5のbashですが、UNIX一般の質問と思われるのでこのようなタイトルにしました。 catコマンドで、あるテキストファイルのあとに、同じテキストファイルをつくろうと思いましたが、無限ループになってしまい、巨大ファイルができてしまいます。 最初、このようにしてa.txtという1行のファイルを作りました。  [~]$ cat > a.txt  aaa それで、同じa.txtを  aaa  aaa という2行のファイルにしたいと思い、以下のようなコマンドを入力しました。 [~]$ cat a.txt >> a.txt 自分の目論見としては、a.txtの内容がa.txtに追加されるので、2行になるかと思いましたが、応答がなくなりました。 Ctrl+Cで停止し、a.txtの内容を見ると [~]$ cat a.txt aaa aaa aaa aaa aaa aaa ・・・・・・ と何千行も入っています。 ファイルのサイズはこれぐらいでした。 [~]$ ls -al a.txt -rw-r--r-- 1 TYWalker staff 16898724 9 22 12:57 a.txt これは、なぜこのような現象になるのでしょうか。 また、私が本来やろうとしたことを、簡単なコマンドで行うにはどうすればいいでしょうか。 よろしくお願いします。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

cat a.txt >> a.txt とすると、 まず現在のa.txtの内容を読み出し、a.txtに追記されます。 すると、 aaa\n (←次はここから読み込まれる)(catにより、追加されている→) aaa\n となります。ファイルには続きがあるので、それが読み込まれてa.txtに追記されます aaa\naaa\n (←次はここから読み込まれる)(上の続きで追加されている→) aaa\n まだファイルの続きがあるので読み込まれて追記されます.以下同様 これが延々と続く理由です。 出力を別のファイルにするとか cat a.txt a.txt > b.txt 別のファイルにコピーしてから追記するとか cp a.txt c.txt cat c.txt >> a.txt

TYWalker
質問者

お礼

ありがとうございます! 納得いきました!

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

sed 2q a.txt >> a.txt でできちゃったりして.

TYWalker
質問者

お礼

sedですか。これもかっこいいですね! ありがとうございます!

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ぱっと思いつくものは標準出力経由での書き込み cat a.txt | tee -a a.txt

TYWalker
質問者

お礼

ありがとうございます!

関連するQ&A

  • UNIXのコマンド教えて下さい。

    UNIXで、lsの結果をファイルに出力する際、 ls > aaa.txtのようにすると出来ますが、 実行したコマンド "ls -la > aaa.txt" もファイルに出力させたいのですが、どうすれば出来ますか? 知ってる方教えて下さい!

  • unix sedコマンドについて

    file --------------------------------------- abcdefghijklmnopqrstu abcdefghijklmnopqrstu person=aaa wake walk work abcdefghijklmnopqrstu abcdefghijklmnopqrstu --------------------------------- といったファイルにて このファイルからperson~空白行を「sedコマンド」で削除したいのですがどのようにしたらよいでしょうか。 sedコマンドを使用すると、どうやら、数行あるテキストを一行にまとめ、空白行を見つけたらその行を削除するといった動きになるようです。(一行でそれを行うのでしょうか。。) どなたか、わかる方いたら教えていただけないでしょうか。 よろしくお願いします。

  • UNIXには直接ファイル操作コマンドありますか?

    本当に困ってます(T_T) UNIXのShell Scriptでテキストファイルの一部(何行か)を削除したいです。リダイレクト機能とか使わないで、直接ファイルから削除することはできますか? UNIXって直接ファイル編集するコマンド聞いたことないですが、そういうコマンドありますか?

  • Unixのコマンドについて

    Windows上で、cygwinを動かしています。 50行から成るテキストファイルが50個あります。各ファイルの各行を取りだして、1つのファイルにまとめるにはどのようなコマンドを使えばできますか? 例でいうと下記のようになります。ファイルAとファイルBからファイルCを作成したいです。 [ファイルA]   [ファイルB] 1行目      1行目 2行目      2行目 3行目      3行目 ・・・        ・・・ [ファイルC] ファイルAの1行目 ファイルBの1行目 ・・・ ご教授いただければ幸いです。よろしくお願いします。

  • ○行目から□行目だけを表示するコマンド

    テキストファイルの中から、10行目から20行目のみを表示するようなコマンドがあれば教えてください。 CATやMOREのようなコマンドにオプションで行数を指定して指定した行数だけを見ることは可能でしょうか? もしコマンドで一発で無理なら、hoge.txtというファイルの10行目から20行目までを表示するような簡単なシェルの書き方を教えてください。 よろしくお願いします。

  • UNIX C ファイル出力

    UNIX Cにてあるテキストファイルの中身(1行分)を、別のテキストファイルに出力したいのですが、どうすれば、いいでしょうか。 例。A.txt 123 yano 200612   ↓ B.txt 123 yano 200612

  • UNIX teeコマンドについて

    あるテストプログラムの実行結果をteeコマンドで、ログに追加出力しようとしています 以下の1.変更前の様にシェルスクリプトを作成しました。 このシェルスクリプトを実行するとteeコマンドが正常終了するので $? が常に0になってしまい、必ずOKになってしまいます 急いでいたので2.のように修正したのですが、テンプファイルを使わないでもうちょっとシンプルに作成する方法をご存知の方教えてください 1.変更前 ./testpgm | tee -a logfile.txt  if [ $? -eq 0 ] ; then  echo "OK,testpgm," | tee -a logfile.txt else echo "NG,testpgm," | tee -a logfile.txt fi 2.変更後 ./testpgm > tempfile.txt if [ $? -eq 0 ] ; then cat tempfile.txt>>logfile.txt cat tempfile.txt echo "OK,testpgm," | tee -a logfile.txt else cat tempfile.txt>>logfile.txt cat tempfile.txt echo "NG,testpgm," | tee -a logfile.txt fi rm tempfile.txt OSはAIXで、シェルはshのみ使用可です

  • UNIXのコマンドmore cat の使用方法

    solaris9を使用しています。 windows機からteratermでマクロを使用しログファイルを取得しています。 コマンドで困っていますので教えてください。 下記のコマンド  more *aaa* 正規表現を使用し、『aaa』が含まれるログファイルの内容をすべて表示するようにしています。 便利な事にログファイル名がヘッダーのように表示されとてもわかりやすいのですが、 spaseキーを押さないと次の画面表示がされなかったり、ログファイルのたびに止まります。 そのためcatを使用したのですが、ログの内容がすべて結合し、どのログファイルなのか わからなくなっています。 マクロで使用していて自動でログをわかりやすく結合したいと思っています。 教えてください。

  • 大きいサイズのファイルの扱い方 UNIX AIX

    お世話になります。 UNIX(AIX)環境での大きいサイズのファイルの扱いについての質問です。 viで大きいサイズ(500MBくらい)のテキストファイルを 開きたいのですが、マシンのメモリ不足で開くことができません。 このような大きいサイズのファイルを 大雑把にわけたい(3等分とか、5等分とか)のですが どのような方法があるか?教えてください。 (マシンの性能を上げる!という解答以外でおねがいします。) wcコマンドで全体の行数を調べようとしても、エラーが帰ってきてしまって調べられません。 headコマンドで頭から100行出力しようとしてもエラーが帰ってきます。 tailコマンドを使えば、ファイルの終端から、サイズを決めて出力することは、できます。 tailコマンド使用例 tail -k 50000 AAA.txt > BBB.txt

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

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