
Quiero poder hacer esto: cambiar el nombre string1
y string3
agregarlo string2
al principio. Algo como Fish renombrado a Great_Bear si se encuentra la cadena Fish y Great_ = string2.
Hasta ahora tengo esto:
ls | sed s'/\(.*\)\(string1\)\(.*\)/mv \"&\" \"\1string3\" /' | bash
Esto hace el trabajo para el directorio actual.
ls -d $PWD/**/* | sed s'/\(.*\)\(string1\)\(.*\)/mv \"&\" \"\1string3\" /' | bash
Esto funciona sólo en subdirectorios y no en aquel donde está el script.
También me gustaría saber cómo agregarlo string2
al principio del nombre del archivo.
Respuesta1
Lo usaría rename
con una */*
combinación simple, no con el patrón globstar.
rename 's|([^/]+)/(.+)|$1/$1_$2|' */* -vn
Estamos haciendo coincidir un directorio y luego algo que contiene. Esto es algo más seguro que globstar porque no queremos recurrir demasiado.
El -n
final lo detiene en realidad.haciendocualquier cosa. Simplemente te lo mostrará. Elimínalo cuando estés seguro de que es correcto. Sin embargo, aquí hay un pequeño arnés de prueba:
$ mkdir -p test/test{1..3} && touch test/test{1..3}/file{1..3}
$ cd test
$ rename 's|([^/]+)/(.+)|$1/$1_$2|' */* -vn
test1/file1 renamed as test1/test1_file1
test1/file2 renamed as test1/test1_file2
test1/file3 renamed as test1/test1_file3
test2/file1 renamed as test2/test2_file1
test2/file2 renamed as test2/test2_file2
test2/file3 renamed as test2/test2_file3
test3/file1 renamed as test3/test3_file1
test3/file2 renamed as test3/test3_file2
test3/file3 renamed as test3/test3_file3
Respuesta2
Esto debería funcionar:
find . -type f -exec rename -n 's/(.*)\/(.*)string1(.*)/$1\/string3$2string2$3/' {} +
find . -type f -exec
: busca recursivamente archivos en la jerarquía del directorio de trabajo actual y ejecuta el resto de la línea de comando expandiéndose{} +
a la lista de resultados;rename -n 's/(.*)\/(.*)string1(.*)/$1\/string3$2string2$3/' {} +
: coincide y agrupa cualquier número de cualquier carácter hasta la última aparición de/
, coincide con un/
, coincide y agrupa cualquier número de cualquier carácter hasta la última aparición destring1
, coincidestring1
y coincide y agrupa cualquier número de cualquier carácter; reemplaza la coincidencia con el primer grupo capturado seguido de un/
carácter seguidostring3
del segundo grupo capturado seguidostring2
del tercer grupo capturado (-n
realizarename
un ensayo; elimínelo para cambiar el nombre de los archivos).
% 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)