• ベストアンサー

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

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

noname#41382
noname#41382

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

  • ベストアンサー
回答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

  • すべてのファイルに対してgrepをかける方法を教えてください。

    /(ルート)配下にあるすべてのディレクトリ(サブディレクトリ)配下のファイルに対して、'test'という文字列が入っているかどうかを調べたいと思っています。 サブディレクトリは何階層にもなっており、存在するすべてのファイルに対して検索をかけたいと思っています。 以上のような場合にどのようにgrepを使用すればよいのでしょうか?

  • すべてのディレクトリに対してgrepをかける方法について教えてください。

    たとえば、/(ルート)配下にあるすべてのディレクトリ(サブディレクトリ)配下のファイルに対して、'test'という文字列が入っているかどうかを調べたいと思っています。 サブディレクトリは何階層にもなっており、存在するすべてのファイルに対して検索をかけたいと思っています。 以上のような場合にどのようにgrepを使用すればよいのでしょうか? よろしくお願いします。

  • ファイル名に特定の文字列を含むファイルを開きたい

    セルに「abc」という文字列があります。 このセルをダブルクリックすると、特定のフォルダ内にある abcを含むファイル(たとえば090507 abc)を開く というようなことをしたいのですが、どのようにしたらよいでしょうか。 対象セルはA列です。 たとえばA2に「abc」とあれば、A2をダブルクリックすると 特定フォルダ内のabcをファイル名に含むファイルを開く A3に「xyz」とあれば、A3をダブルクリックすると 特定フォルダ内のxyzをファイル名に含むファイルを開く といった具合です。 文字列の指定はダブルクリック以外の方法でも構いません。 知識がないものでどのようにしたらよいかわかりません。 どなたかお詳しい方、どうぞよろしくお願い致します。 (ごく簡単なマクロの知識はあります)

  • Telnetコマンド/ディレクトリ内の複数ファイルの中から特定の文字列を置換したい

    TelnetでLinuxにログインしています。 ディレクトリ内の複数ファイルの中から特定の文字列を置換したいのですが、その方法(コマンド)がわかりません。 例えば、/webディレクトリ内にある全ファイルの中から、「abc」という文字列を見つけて、それを「xyz」に置換したいのです。 どうぞ、ご指南の程、宜しくお願い致します。

  • サブディレクトリ内のすべてのファイルの文字の置換

    コマンドラインから、サブディレクトリ内のすべてのファイルの文字を置換する方法を教えてください。 for x in *.*; \ do \ sed -e 's/original_pattern/replaced_pattern/g' $x > ${x}_tmp ; \ mv -f ${x}_tmp $x ; \ done とすることにより、ひとつのディレクトリ内であれば、文字列を変換できました。 しかし、そのディレクトリのサブディレクトリ内のファイルについても、再帰的に変換を行いたいのです。 grep -r などと組み合わせればよいのかとも思ったのですが、結局よくわかりませんでした。 よろしくお願いいたします。

  • 特定の「文字列を含まない」正規表現

    tarコマンドでファイルのアーカイブを作成しようとしています。 特定のディレクトリは対象外としたいのですが、正規表現の記述がわかりません。 ご教授いただきたくお願いいたします。 具体的には、、 --- ディレクトリ「abc」配下にあるファイルをアーカイブする場合、 tar cvf /tmp/xxxx.tar abc などと記述しますが、abc配下にある「statistics」といディレクトリはアーカイブ対象外とし、statistics以外をアーカイブしたいのですが、方法がわかりません。 シェルは bashです。 どなたかご存じの方、よろしくお願いいたします。

  • 文字列変換

    $word = 'abc'; &word_check($FORM{'comment'}); sub word_check { local($wd) = @_; local($flag); foreach ( split(/,+/, $word) ) { if (index($wd,$_) >= 0) { $flag=1; last; } } if ($flag) { $FORM{'comment'} =~ s/($word)/【文字変換$1】/g; } } $FORM{'comment'}に$wordの文字列が含まれていた場合には対象文字列を変換しようと考えています。 上記のように$wordにabcのみでしたらうまく変換されるのですが、 $word = 'abc,123';というように複数指定した場合にうまくいきません。 繰り返す処理を使うのだと思いますが、あまり知識がないため、うまく出来ません。よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • サブディレクトリも含めて最新のファイルを調べる

    Linux 上のあるディレクトリ配下に存在するすべてのファイルの中で(サブディレクトリ配下も含めて) 更新日時が最新のファイルを抽出したいのですが やり方をご存知であれば教えてください。 ディレクトリが一つだけ or 対象が特定できるなら ls -lrt とかで分かりますが 再帰的にすべてのサブディレクトリを対象としたいのです。 できれば1回のコマンド(ワンライナー)で実行できるとありがたいですが、 それはさすがに大変な気がしますので、 あくまでできればということで。。

  • grepによる文字列検索のシェル作成の手順

    Solaris9のOSにて、以下の仕様のシェルを作成したいと思っています。 特定のディレクトリ配下にある全てのファイル内で特定の文字列「abc」のある行を抽出し、ファイル化したい。 (検索対象が1ファイルであれば、grep -n abc test.txtでよいですが、ファイル名がたくさんある場合のシェルの作り方がわかりません。) また、どのファイルから検索したのかがわかるように抽出した行の前にファイル名をつけられると大変助かります。 例) ---test1.txtから検索--- 8:XXXXabcXXXX 11:XXXXabcXXX ---test2.txtから検索--- 10:XXXXXXXXabcXX お手数ですが、宜しくお願いします。

  • 【C言語】大文字小文字に関わらず文字列を検索したい

    C言語で文字列を検索処理があるものですが、 以下のようなことがうまくできず困っています。 1.検索対象はファイルから読み込んだメモリ内の文字列。 2.対象の文字列は大文字小文字に関わらずに抽出する。 例えば、「abc」を検索するとして、文字列内が aaaaBccccdefgだとすると… aaa「aBc」cccdefg かっこ内を検索します。 strstrだと、完全な一致しかヒットしないので… 長い文字列が対象になることもあるので、 すべての組み合わせを見るのも性能的に難しいです。 何か方法ご存知の方いらっしゃいましたら、よろしくお願いします。