2

たとえば、フォルダ内のすべての.txtファイルに含まれる「123」のすべてのインスタンスを「321」に(再帰的に)置き換えたいと思います。私はこれをやろうと思った

sed -i 's/123/321/g' | find . -name \*.txt

しかし、おそらくすべてのファイルを台無しにする前に、それが機能するかどうかを尋ねたいと思います。

4

1 に答える 1

6

sedfind後ろから前があります。GNUsed-iオプションを使用すると、次を使用できます。

find . -name '*.txt' -type f -exec sed -i s/123/321/g {} +

find拡張子が付いたファイルを検索し、それらのグループに対してコマンド.txtを実行します(これが最後です。これは、POSIX 2008の標準ですが、すべてのバージョンが必ずしもサポートしているわけではありません)。この置換例では、コマンドを誤って解釈する危険性がないため、引用符で囲んでいません。ただし、単純さと一般的な安全性のために、可能な限りスクリプトを一重引用符で囲むことをお勧めします。sed -i+finds/123/321/gsed

また、次を使用することもできますxargs(また、GNU拡張機能を使用-print0してfindおよび-0に):-rxargs

find . -name '*.txt' -type f -print0 | xargs -0 -r sed -i 's/123/321/g'

-r「引数がない場合は実行しない」という意味です(したがって、はfind何も見つかりません)。-print0とは-0連携して機能し'\0'、改行ではなくCのヌルバイトで終わるファイル名を生成し、改行や空白などを含むファイル名の誤解を回避します。

実際のデータでスクリプトを実行する前に、スクリプトをテストすることができ、テストする必要があることに注意してください。ダミーディレクトリ(私は通常それと呼びますjunk)を作成し、いくつかのサンプルファイルをジャンクディレクトリにコピーし、ディレクトリをジャンクディレクトリに変更し、それらのファイルでスクリプトをテストします。それらはコピーなので、何か問題が発生しても害はありません。そして、後でディレクトリ内のすべてを削除するだけでrm -fr junk済みます。苦痛を与えることはありません。

于 2012-10-01T18:52:54.477 に答える