Buscando un script de shell más sencillo para renombrar múltiples archivos con múltiples patrones.
Tengo un montón de archivos con esta convención de nombres:
file01_2018-10-05_123456.pdf
file01_2018-10-06_443352.pdf
file02_2019-09-20_222222.pdf
file02_2019-01-27_246821.pdf
file03_2017-11-22_654321.pdf
file03_2017-04-14_987654.pdf
Tengo un script que encuentra el archivo más reciente de cada número de archivo (file01-file03) y lo renombra a T3031, T3032, T3033, recorta todo después del primer carácter y agrega la fecha de última modificación del archivo. Terminan pareciendo que esto (que es exactamente lo que quiero):
T3031-2018Oct06.pdf
T3032-2019Sep20.pdf
T3033-2017Nov22.pdf
Es solo que el script me parece largo y feo para mí (hay 17 bucles para file01-file17). Espero que alguien tenga una solución más elegante.
Aquí está parte de lo que tengo:
for F in $(ls -t | grep file01 | head -1)
do
RUNDATE="$(date -r $F +%Y%b%d)"
a="$(echo $F | head -c6)"
b="$(echo "$a" | sed 's/file01/T3031/')"
mv "$F" "${b}-${RUNDATE}.pdf" 2> /dev/null
done
for F in $(ls -t | grep file02 | head -1)
do
RUNDATE="$(date -r $F +%Y%b%d)"
a="$(echo $F | head -c6)"
b="$(echo "$a" | sed 's/file02/T3032/')"
mv "$F" "${b}-${RUNDATE}.pdf" 2> /dev/null
done
for F in $(ls -t | grep file03 | head -1)
do
RUNDATE="$(date -r $F +%Y%b%d)"
a="$(echo $F | head -c6)"
b="$(echo "$a" | sed 's/file03/T3033/')"
mv "$F" "${b}-${RUNDATE}.pdf" 2> /dev/null
done
davy.ai
Una forma de simplificar este script sería usar variables y ciclos en lugar de escribir comandos separados para cada número de archivo. Aquí hay un ejemplo:
Esta versión utiliza un ciclo para recorrer los números de archivo
01
a03
(que se pueden ajustar cambiando{1..3}
a un rango diferente), establece variables para los prefijos de archivo actuales y nuevos (file01
yT3031
, etc.), encuentra el archivo más reciente para ese prefijo y lo renombra utilizando la fecha de ejecución y el nuevo prefijo. Esto debería ser mucho más corto y modular que la versión anterior.