Isso deve funcionar:
find . -type f -exec rename -n 's/(.*)\/(.*)string1(.*)/$1\/string3$2string2$3/' {} +
-
find . -type f -exec
: procura recursivamente por arquivos na hierarquia do diretório de trabalho atual e executa o restante da linha de comando expandindo{} +
para a lista de resultados; -
rename -n 's/(.*)\/(.*)string1(.*)/$1\/string3$2string2$3/' {} +
: corresponde e agrupa qualquer número de qualquer caractere até a última ocorrência de/
, corresponde a/
, corresponde e agrupa qualquer número de qualquer caractere até a última ocorrência destring1
, corresponde astring1
e corresponde e agrupa qualquer número de qualquer caractere; substitui a correspondência pelo primeiro grupo capturado seguido por um caractere/
seguido porstring3
seguido pelo segundo grupo capturado seguido porstring2
seguido pelo terceiro grupo capturado (-n
tornarename
executar uma execução a seco ; remova-o para realmente renomear os arquivos).
% tree
.
└── dir
├── string1_bar.jpg
├── string1_foobar.jpg
└── string1_foo.jpg
1 directory, 3 files
% find . -type f -exec rename -n 's/(.*)\/(.*)string1(.*)/$1\/string3$2string2$3/' {} +
rename(./dir/string1_foo.jpg, ./dir/string3string2_foo.jpg)
rename(./dir/string1_foobar.jpg, ./dir/string3string2_foobar.jpg)
rename(./dir/string1_bar.jpg, ./dir/string3string2_bar.jpg)