UNIX の検索キーワードに一致する複数のファイルの名前を変更する

UNIX の検索キーワードに一致する複数のファイルの名前を変更する

yyy名前を含むファイルを検索する find コマンドから次の出力が得られます。

./plonetheme/xxx/yyy-logo.png
./plonetheme/xxx/profiles/default/plonetheme.yyy_various.txt
./plonetheme/xxx/skins/plonetheme_yyy_custom_images
./plonetheme/xxx/skins/plonetheme_yyy_custom_images/CONTENT.txt
./plonetheme/xxx/skins/plonetheme_yyy_custom_templates
./plonetheme/xxx/skins/plonetheme_yyy_custom_templates/CONTENT.txt
./plonetheme/xxx/skins/plonetheme_yyy_custom_templates/main_template.pt
./plonetheme/xxx/skins/plonetheme_yyy_styles
./plonetheme/xxx/skins/plonetheme_yyy_styles/base_properties.props
./plonetheme/xxx/skins/plonetheme_yyy_styles/CONTENT.txt

yyy文字列が に置き換えられるようにすべてのファイルの名前を変更するにはどうすればよいですかzzz?

答え1

使用できますbash 文字列操作あなたが望むことを達成するには:

find PATH/PATTERN -exec bash -c 'mv "$0" "${0/yyy/zzz}"' {} \;

スイッチ-execは、エスケープされた までのコマンドを実行します;。 は、{}現在処理されているファイルのパスです。

bash -c 'mv "$0" "${0/cix/stix}"' {}そのパスを引数として bash に渡し、bash は$0(最初の引数、例: ./plonetheme/xxx/yyy-logo.png) を${0/yyy/zzz}(最初に操作された引数、例: ./plonetheme/xxx/zzz-logo.png) に移動します。

答え2

説明どおりここ-print0およびを使用できますread -r -d'':

find /path/to/files -type f -print0 | while IFS= read -r -d '' file; do
    mv "$file" "${file/yyy/zzz}"
done

関連情報