ディレクトリツリー(../MyParentFolder)内の特定のファイル拡張子(「* .txt」)内で文字列(「AAA」)を見つけ、サブフォルダ名(MySubfolder)に変更したいと思います。誰かが同様の質問をしたことを知っています。ここただし、サブフォルダの名前を変更するには移動できません。
答え1
3番目の例を使う(exec
)受け入れられた回答到着特定のファイル拡張子の文字列の検索と置換:
find myDirectory/. -type f -name '*.txt' -exec sed -i "$replace" {} +
まず、設定は$replace
次のとおりです。
replace='s/AAA/MySubfolder/'
find
その後、コマンドを実行してください。
export
replace
注:始める必要があるかもしれません。その他コマンド処理の使用find
:
export replace='s/AAA/MySubfolder/'
また、「AAA」が1行に複数回表示され、それらをすべて置き換えるには、次の手順を実行する必要があります。グローバル、このように
s/AAA/MySubfolder/g
答え2
GNUgrep
または互換バージョンを使用すると、次のことができます。
grep -rlZ --include='*.txt' AAA ../MySubfolder |
perl -MFile::Basename -pi -e '
BEGIN {local $/ = "\0"; @ARGV = <STDIN>}
if ($. == 1) {
$replacement = basename dirname $ARGV;
}
s/AAA/$replacement/g;
close ARGV if eof' ''
ここでは、n回編集されたファイルが複数回含まれるファイルをgrep
探し、各ファイルの最初の行を読み取るときに置き換えるtxt
ファイル名からフォルダ名を抽出します。AAA
perl
i
AAA
1
したがって、inとinAAA
に置き換えられます。MySubfolder
../MySubfolder/a.txt
foo
../MySubfolder/foo/b.txt
常にAAA
に置き換えるには:MySubfolder
grep -rlZ --include='*.txt' AAA ../MySubfolder |
xargs -r0 perl -pi -e 's/AAA/MySubfolder/g'
(GNUxargs
または互換仮定)。
GNUはsed
内部編集機能-i
もサポートしているので、ここで簡単に置き換えて使用できます。perl
perl
grep -rlZ --include='*.txt' AAA ../MySubfolder |
xargs -r0 sed -i 's/AAA/MySubfolder/g'