たとえば、フォルダ内のすべての.txtファイルに含まれる「123」のすべてのインスタンスを「321」に(再帰的に)置き換えたいと思います。私はこれをやろうと思った
sed -i 's/123/321/g' | find . -name \*.txt
しかし、おそらくすべてのファイルを台無しにする前に、それが機能するかどうかを尋ねたいと思います。
sed
とfind
後ろから前があります。GNUsed
と-i
オプションを使用すると、次を使用できます。
find . -name '*.txt' -type f -exec sed -i s/123/321/g {} +
find
拡張子が付いたファイルを検索し、それらのグループに対してコマンド.txt
を実行します(これが最後です。これは、POSIX 2008の標準ですが、すべてのバージョンが必ずしもサポートしているわけではありません)。この置換例では、コマンドを誤って解釈する危険性がないため、引用符で囲んでいません。ただし、単純さと一般的な安全性のために、可能な限りスクリプトを一重引用符で囲むことをお勧めします。sed -i
+
find
s/123/321/g
sed
また、次を使用することもできますxargs
(また、GNU拡張機能を使用-print0
してfind
および-0
に):-r
xargs
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
済みます。苦痛を与えることはありません。