
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 ( -vn
significa 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}'