- ベストアンサー
ファイル全てのある文字列を変更したい
Redhat7.1Jを使ってます。 あるディレクトリ配下に属するファイル(サブディレクトリの下のファイルも)全てを対象に 「abc」等の文字列を全て「xyz」等に変換しようとしています。 どのような方法がいいかご指導願います。 ファイル総数は10,000個を越えます。 サブディレクトリも数百あります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ysk6406 さんのようにfind コマンドを使用すればいいと思います。 元ファイルを残しておいたほうが心配がないので、 #!/usr/bin/sh mv $1 $1.bak cat $1.bak | sed 's/abc/xyz/g' > $1 のような簡単なスクリプトを書き、(仮にこれを abctoxyz として実行権を与え てあるとして) find 対象のディレクトリ -type f -exec abctoxyz {} \; のようにすればよいかと思います。何かあってコマンドが固まってもオリジナル ファイルが残っていれば安心です。(ファイルシステムフルには気をつけないと いけませんね。スクリプトを適当に工夫してください。)
その他の回答 (3)
- TrickOrTreat
- ベストアンサー率42% (53/126)
補足しますね。 -exec コマンド名 {} \; {} は、find が見つけた条件の合う対象ファイル名で置換されます。 第一引数にファイル名を取るコマンドを実行するということです。 \ は ; をエスケープするために使います。意味はありません。 core を消すために、 find . -name core -exec rm {} \; などとよく使われます。
お礼
補足ありがとうございました。 わかりやすい例 たすかります。
- juna
- ベストアンサー率42% (8/19)
>すみませんが >>find 対象のディレクトリ -type f -exec abctoxyz {} \; >の「 {} \」部分はなにをしているか教えてください。 find(1)を読みましょう http://www.linux.or.jp/JM/html/GNU_findutils/man1/find.1.html
お礼
ありがとうございました。 参考URL 大変参考になりました。
- ysk6406
- ベストアンサー率40% (237/589)
おそらく様々な回答が寄せられると思いますが、私がよくやる方法をご紹介します。 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 は、対象となるツリーの一番上のディレクトリ名です。
お礼
早速のご回答ありがとうございます。 大変参考になりました。 >おそらく様々な回答が寄せられると思いますが... > コマンド1つではできないようですね。 他にどんな回答がくるか楽しみです。 ^ ^;
補足
回答ありがとうございます。 すみませんが >find 対象のディレクトリ -type f -exec abctoxyz {} \; の「 {} \」部分はなにをしているか教えてください。