テストファイル作成
$ mkdir replace_test $ vim replace_test/file_name_01.txt test_before $ vim replace_test/file_name_02.txt test_not_replace $ mkdir replace_test/dir $ vim replace_test/dir/file_name_03.txt test_before $ vim replace_test/dir/file_name_04.txt test_not_replace $ tree replace_test replace_test |-- dir | |-- file_name_03.txt | `-- file_name_04.txt |-- file_name_01.txt `-- file_name_02.txt 1 directory, 4 files
find、grep、sedコマンドで再帰的に置換し、置換後のファイルを「ファイル名_old」として出力
find replace_test/ -name "*file_name*" | xargs grep -l 'before' | xargs sed -i_old -e 's/before/after/g'
結果確認
$ tree replace_test replace_test |-- dir | |-- file_name_03.txt | |-- file_name_03.txt_old | `-- file_name_04.txt |-- file_name_01.txt |-- file_name_01.txt_old `-- file_name_02.txt 1 directory, 6 files $ diff replace_test/file_name_01.txt replace_test/file_name_01.txt_old 1c1 < test_after --- > test_before $ diff replace_test/dir/file_name_03.txt replace_test/dir/file_name_03.txt_old 1c1 < test_after --- > test_before
置換前ファイル削除
$ find replace_test/ -name "*file_name*_old" | xargs rm -f $ tree replace_test replace_test |-- dir | |-- file_name_03.txt | `-- file_name_04.txt |-- file_name_01.txt `-- file_name_02.txt