• ベストアンサー

ファイル全てのある文字列を変更したい

Redhat7.1Jを使ってます。 あるディレクトリ配下に属するファイル(サブディレクトリの下のファイルも)全てを対象に 「abc」等の文字列を全て「xyz」等に変換しようとしています。 どのような方法がいいかご指導願います。 ファイル総数は10,000個を越えます。 サブディレクトリも数百あります。

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

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

ysk6406 さんのようにfind コマンドを使用すればいいと思います。 元ファイルを残しておいたほうが心配がないので、 #!/usr/bin/sh mv $1 $1.bak cat $1.bak | sed 's/abc/xyz/g' > $1 のような簡単なスクリプトを書き、(仮にこれを abctoxyz として実行権を与え てあるとして) find 対象のディレクトリ -type f -exec abctoxyz {} \; のようにすればよいかと思います。何かあってコマンドが固まってもオリジナル ファイルが残っていれば安心です。(ファイルシステムフルには気をつけないと いけませんね。スクリプトを適当に工夫してください。)

noname#41382
質問者

補足

回答ありがとうございます。 すみませんが >find 対象のディレクトリ -type f -exec abctoxyz {} \; の「 {} \」部分はなにをしているか教えてください。

その他の回答 (3)

回答No.4

補足しますね。 -exec コマンド名 {} \; {} は、find が見つけた条件の合う対象ファイル名で置換されます。 第一引数にファイル名を取るコマンドを実行するということです。 \ は ; をエスケープするために使います。意味はありません。 core を消すために、 find . -name core -exec rm {} \; などとよく使われます。

noname#41382
質問者

お礼

補足ありがとうございました。 わかりやすい例 たすかります。

  • juna
  • ベストアンサー率42% (8/19)
回答No.3

>すみませんが >>find 対象のディレクトリ -type f -exec abctoxyz {} \; >の「 {} \」部分はなにをしているか教えてください。 find(1)を読みましょう http://www.linux.or.jp/JM/html/GNU_findutils/man1/find.1.html

参考URL:
http://www.linux.or.jp/JM/html/GNU_findutils/man1/find.1.html
noname#41382
質問者

お礼

ありがとうございました。 参考URL 大変参考になりました。

  • ysk6406
  • ベストアンサー率40% (237/589)
回答No.1

おそらく様々な回答が寄せられると思いますが、私がよくやる方法をご紹介します。 bash 等の B-shell 系シェルで、次のようなスクリプトを実行します。 (C-shell を使っている場合は、まず“sh”と入力して、B-sh に移って下さい。) find dirname -type f -print | while read FILE do ex - $FILE << EOF %s/abc/xyz/g w EOF done ここで、dirname は、対象となるツリーの一番上のディレクトリ名です。

noname#41382
質問者

お礼

早速のご回答ありがとうございます。 大変参考になりました。 >おそらく様々な回答が寄せられると思いますが... > コマンド1つではできないようですね。 他にどんな回答がくるか楽しみです。 ^ ^;

関連するQ&A