Cambie el nombre de varios archivos utilizando secuencias de comandos Bash

Cambie el nombre de varios archivos utilizando secuencias de comandos Bash

Quiero cambiar el nombre de varios archivos en el mismo directorio usando secuencias de comandos Bash. Los nombres de los archivos son los siguientes:

file2602201409853.p
file0901201437404.p  
file0901201438761.p  
file1003201410069.p  
file2602201410180.p

Quiero cambiar el nombre al siguiente formato:

file2503201409853.p
file2503201437404.p  
file2503201438761.p  
file2503201410069.p  
file2503201410180.p

Estuve leyendo sobre el comando de cambio de nombre e intenté hacerlo de esta manera, pero no hace nada, creo que tengo preguntas sobre la sintaxis. Luego leí que puedes hacer un bucle usando elmvcomando de la siguiente manera:

for file in cmpsms*2014*.p; do
    mv "$file" "${file/cmpsms*2014*.p/cmpsms25032014*.p}"
done

Pero no puedo cambiar el nombre de los archivos. ¿Qué estoy haciendo mal?

Respuesta1

Tenías razón al considerar cambiar el nombre primero. La sintaxis es un poco extraña si no estás acostumbrado a las expresiones regulares, pero es, con diferencia, la ruta más rápida/corta una vez que sabes lo que estás haciendo:

rename 's/\d{4}/2503/' file*

Eso simplemente hace coincidir los primeros 4 números y los intercambia por los que usted especificó.

Y un arnés de prueba ( -vnsignifica ser detallado pero nohacercualquier cosa) usando sus nombres de archivo:

$ rename 's/\d{4}/2503/' file* -vn
file0901201437404.p renamed as file2503201437404.p
file0901201438761.p renamed as file2503201438761.p
file1003201410069.p renamed as file2503201410069.p
file2602201409853.p renamed as file2503201409853.p
file2602201410180.p renamed as file2503201410180.p

Respuesta2

Esto debería funcionar:

for f in file*; do mv $f ${f/${f:4:8}/25032014}; done

Reemplaza la cadena entre el cuarto y el duodécimo carácter con "25032014".

Respuesta3

Esta es realmente la respuesta de @Eric desde arriba, pero es una respuesta elegante, así que la volveré a publicar como una respuesta adecuada para llamar más la atención.

for f in *Huge*; do mv "$f" "${f/Huge/Monstrous}"; done

Respuesta4

Una forma nativa sencilla de hacerlo sin bucles, conrecorrido de directorio:

find -type f | xargs -I {} mv {} {}.txt

Cambiará el nombre de todos los archivos existentes.

Y debajo un ejemplo práctico conparalelización:

find -name "file*.p" | parallel 'f="{}" ; mv -- {} ${f:0:4}2503${f:8}'

información relacionada