
いくつかのサブディレクトリがあるディレクトリがあります。たとえば、 「」*A*.txt
を*B*.txt
含む2種類のファイルがあることを知っています。古い文字列「をそのディレクトリに入れます。そのディレクトリを」に置き換えたいです。新しい文字列1つのコマンドでこれを実行できますか?つまり、"*B*.txt"
このコマンドのどこかに次を追加できます。
find . -type f -name "*A*.txt" -exec sed -i 's/oldString/newString/g' {} \;
答え1
あなたは試すことができます:
find . -type f \( -name "*A*.txt" -o -name "*B*.txt" \) \
-exec sed -i 's/oldString/newString/g' {} +
(ここでは、ファイルごとに1つの呼び出しを実行しない+
ように置き換えも使用されます。追加の利点は次のとおりです。;
sed
どの呼び出しがsed
ゼロ以外の終了状態で返されます。
答え2
それが本当ならただ一つ手紙、次のようにすることができます。
find . -type f -name "*[AB]*.txt" -exec sed -i 's/oldString/newString/g' {} \;
明確に言えば、これは単一の文字を一致として使用する場合にのみ機能します。
答え3
GNUがある場合は、代わりに次のことを行うfind
ことができます。-regex
-name
find . -type -f -regextype egrep -regex "(.*A.*|.*B.*)\.txt" -exec sed -i 's/oldString/newString/g' {} \;
ノートパターンがファイルのディレクトリパスにも表示される場合は、正規表現を変更する必要があります(@StéphaneChazelasの説明に従って)。
-regex ".*(A|B)[^/]*\.txt"
/
パターンの後に表示される項目はすべて除外されます。
以下を使用して、正規表現型が使用egrep
可能かどうかを確認できます。
find -regextype help