Reemplace parte del nombre de archivo con una cadena en los subdirectorios y el directorio actual

Reemplace parte del nombre de archivo con una cadena en los subdirectorios y el directorio actual

Quiero poder hacer esto: cambiar el nombre string1y string3agregarlo string2al 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 string2al principio del nombre del archivo.

Respuesta1

Lo usaría renamecon 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 -nfinal 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 de string1, coincide string1y coincide y agrupa cualquier número de cualquier carácter; reemplaza la coincidencia con el primer grupo capturado seguido de un /carácter seguido string3del segundo grupo capturado seguido string2del tercer grupo capturado ( -nrealiza renameun 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)

información relacionada