Fechas de creación de cambios por lotes basadas en nombres de archivos

3

Tengo archivos que se denominan como "12. 2017-04-11 063118.jpg" y "123. 2016-09-05 115236.jpg". El número a la izquierda del "." Cuenta como un índice de 1 a 1400.

¿Cómo puedo configurar la fecha y hora de creación de acuerdo con la forma en que se especifica en el nombre del archivo para todos los 1400 archivos que tengo en la carpeta? Sé que el comando touch -t cambia la fecha de creación, pero no sé cómo extraer la información de fecha / hora del nombre de archivo y poner esto en un comando, por lo que esto se hace automáticamente para todos los archivos.

Sé por otro hilo que lo siguiente debería funcionar. pero no sé cómo ajustar la conversión de texto para que se aplique correctamente a mi convención de nomenclatura de archivos.

for f in *; do
    t=$(echo $f | sed -E 's/([A-z]*-)|([ ,;])|(\..*)//g' | sed -E 's/(.*)(..)/./')
    touch -t $t "$f"
done

El código anterior funciona si mi convención de nomenclatura de archivos es como "clip-2014-01-31 18; 50; 15.mp4", sin embargo, tengo un formato diferente: "12. 2017-04-11 063118.jpg ", y" 123. 2016-09-05 115236.jpg ". ¿Alguien sabe cómo modificar el comando de función sed para procesar la conversión en el formato correcto para el toque?

    
pregunta Brent 06.05.2017 - 02:26

3 respuestas

5

La expansión del parámetro Bash funcionará:

for f in *; do
    t="${f#* }"
    t="${t%%.*}"
    t="${t:0:4}${t:5:2}${t:8:2}${t:11:2}${t:13:2}.${t:15:2}"
    touch -t $t "$f"
done
  • t="${f#* }" elimina la parte antes de (< el primer espacio)
  • t="${t%%.*}" quita la parte después de .
  • t="${t:0:4}${t:5:2}${t:8:2}${t:11:2}${t:13:2}.${t:15:2}" formatea el contenido de la variable de fecha (t) para el toque que requiere el siguiente formato: [[CC] YY] MMDDhhmm [.SS].

Y como una sola línea:

for f in *; do t="${f#* }"; t="${t%%.*}"; t="${t:0:4}${t:5:2}${t:8:2}${t:11:2}${t:13:2}.${t:15:2}"; touch -t $t "$f"; done
    
respondido por el klanomath 06.05.2017 - 04:34
3

Ya que preguntó cómo podría modificar lo que ya tenía, cambiaría los grupos de captura en la primera aparición de sed para que coincida con el nuevo patrón, dejando el segundo sed como está. También doble comillas el $f en echo "$f" | .

Sin embargo, tenga en cuenta que eliminé el uso de la canalización y la segunda aparición de sed , | sed ... , mediante el uso de la opción -e , que agrega los comandos de edición a una lista de comandos.

for f in *; do
    t=$(echo "$f" | sed -E -e 's/(.*\. )|([-])|([ ])|(\..*)//g' -e 's/(.*)(..)/./')
    touch -t $t "$f"
done

Aquí se ajusta como una sola línea:

for f in *; do t=$(echo "$f" | sed -E -e 's/(.*\. )|([-])|([ ])|(\..*)//g' -e 's/(.*)(..)/./'); touch -t $t "$f"; done

Aquí hay una explicación de los grupos de captura en el primer comando de edición sed :

Lo que te deja con 20160905115236 y cuando se procesa con el segundo comando de edición sed , se convierte en 201609051152.36 ya que (.*)(..) lo divide en dos grupos de captura, el segundo que contiene los dos últimos caracteres y el primero que contiene todo lo demas. El . se coloca en la parte de sustitución con /./ referenciados ambos grupos de captura.

    
respondido por el user3439894 06.05.2017 - 07:51
0

Si los archivos contienen etiquetas de salida, el 'exiftool' libre puede cambiar el nombre del archivo de acuerdo con los valores dentro del archivo. Instalarlo también instala una página de manual detallada.

enlace

He utilizado esta herramienta no solo para cambiar los nombres de los archivos, sino también para escribir fragmentos de código HTML para mostrar los archivos en una página web.

    
respondido por el WGroleau 06.05.2017 - 05:42

Lea otras preguntas en las etiquetas