Quiero cambiar el nombre de varios archivos en el mismo directorio utilizando 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
Estaba leyendo sobre el comando de cambio de nombre e intento hacerlo de esta manera, pero no hace nada, creo que tengo preguntas sobre la sintaxis. Luego leí que puedes hacer un bucle usando el comando mv 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?
*
está eso ?Respuestas:
Tenías razón al considerar cambiar el nombre primero. La sintaxis es un poco extraña si no estás acostumbrado a expresiones regulares, pero es, con mucho, la ruta más rápida / más corta una vez que sabes lo que estás haciendo:
Eso simplemente coincide con los primeros 4 números y los intercambia por los que especificó.
Y un arnés de prueba (
-vn
significa ser detallado pero no hacer nada) usando sus nombres de archivo:fuente
rename
es una herramienta de cambio de nombre de archivos completamente diferente (que Debian incluyerename.ul
).rename
al de DebianEsto debería funcionar:
Reemplaza la cadena entre el 4 ° y el 12 ° carácter con "25032014".
fuente
for f in file*; do mv $f ${f/${f:4:4}/2503}; done
también funciona.for f in *Huge*; do mv $f ${f/Huge/Monstrous}; done
Esta es realmente la respuesta de @ Eric desde arriba, pero es una respuesta elegante, así que la vuelvo a publicar como una respuesta adecuada para llamar más la atención.
fuente
Esto debería funcionar. Nota: no tengo la costumbre de entregar comandos masivos de mv, como está escrito es solo un eco. Tendrás que resolver eso antes de que funcione.
fuente
Una forma nativa simple de hacerlo sin bucles, con recorrido de directorio :
Cambiará el nombre de cada archivo en su lugar.
Y a continuación un ejemplo de trabajo con paralelización :
fuente
find -type f -name "file*.p" | parallel 'ext="{}" ; mv -- {} ${ext:0:4}2503${ext:8}'
Si descubres que haces mucho este tipo de cosas, busca "rename.pl". Es un script perl, pero le permite simplemente alimentarlo con código perl (como /// expresión), y hará un cambio de nombre en masa basado en esa expresión o código.
Hay una versión básica aquí: http://stackoverflow.org/wiki/Rename.pl pero hay otras versiones flotando en la red. Ha existido por siglos y siglos.
fuente