特定のファイル拡張子から文字列を検索し、フォルダ名に置き換えます。

特定のファイル拡張子から文字列を検索し、フォルダ名に置き換えます。

ディレクトリツリー(../MyParentFolder)内の特定のファイル拡張子(「* .txt」)内で文字列(「AAA」)を見つけ、サブフォルダ名(MySubfolder)に変更したいと思います。誰かが同様の質問をしたことを知っています。ここただし、サブフォルダの名前を変更するには移動できません。

答え1

3番目の例を使う(exec受け入れられた回答到着特定のファイル拡張子の文字列の検索と置換:

find myDirectory/. -type f -name '*.txt' -exec sed -i "$replace" {} +

まず、設定は$replace次のとおりです。

replace='s/AAA/MySubfolder/'

findその後、コマンドを実行してください。


exportreplace注:始める必要があるかもしれません。その他コマンド処理の使用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ファイル名からフォルダ名を抽出します。AAAperliAAA1

したがって、inとinAAAに置き換えられます。MySubfolder../MySubfolder/a.txtfoo../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もサポートしているので、ここで簡単に置き換えて使用できます。perlperl

grep -rlZ --include='*.txt' AAA ../MySubfolder |
  xargs -r0 sed -i 's/AAA/MySubfolder/g'

関連情報