私はこの乱交を持っています:
replace="s/AAAA/BBBB/g";
find myDirectory/. -type f -print0 | xargs -0 sed -i $replace;
これはツリーを再帰的にスキャンし、その中のすべてのファイルをmyDirectory
置き換えます。AAAA
BBBB
しかし、特定の拡張子を持つファイルでのみこれが発生するように制限したいと思います.txt
。.read
.po
この制限をどのように課しますか?
答え1
-name
検索オプションを使用して、ファイル名に基づいて一致を制限できます。
find myDirectory/. -type f -name '*.txt' -print0 | xargs -0 sed -i "$replace"
複数の拡張機能の場合-o
(または)を使用してグループ化できます()
。
find myDirectory/. -type f \( -name '*.txt' -o -name '*.read' \) -print0 | xargs -0 sed -i "$replace"
-exec
代わりに使用できるもう1つの改善点は、xargs
移植性に優れ、サブシェルを削除することです。
find myDirectory/. -type f -name '*.txt' -exec sed -i "$replace" {} +
答え2
次の設定を次の項目に追加します.bashrc
。
shopt -s extglob globstar
extglob
もう少し開いてください。模様、@(…)
取り外し可能な構造を含みます。再帰ディレクトリナビゲーションをglobstar
有効にします。**/
これにより、以下を使用する必要はありませんfind
。
sed -i "$replace" mydirectory/**/*.@(txt|read|po)
zshでは特別なオプションは必要ありません。ただ実行してください。
sed -i $replace mydirectory/**/*.(txt|read|po)
ファイルが多い場合は、「コマンドラインの長さ制限を超えました」などのメッセージが表示されることがあります。しかし、最新のLinuxシステムの制限は非常に高く、これらの制限が発生する可能性はほとんどありません。
答え3
私はこれをうまく試しました - DBAの存在をAOSに置き換えます
sed -i -E "s/DBA/AOS/g" *.sh