es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , , ,

Answer

  1. Avatar for 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:

    for i in {1..3}
    do
      prefix="file0$i"
      new_prefix="T303$i"
      latest_file=$(ls -t "$prefix"* | head -1)
      run_date=$(date -r "$latest_file" +%Y%b%d)
      mv "$latest_file" "${new_prefix}-${run_date}.pdf" 2> /dev/null
    done
    

    Esta versión utiliza un ciclo para recorrer los números de archivo 01 a 03 (que se pueden ajustar cambiando {1..3} a un rango diferente), establece variables para los prefijos de archivo actuales y nuevos (file01 y T3031, 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.

Comments are closed.