2 votos

Cambiar la fecha de creación al nombre de la carpeta - lote

Hola Tengo un montón de archivos jpg y avi en subcarpetas que se nombran con la fecha de creación de los archivos. Lamentablemente, los propios archivos tienen fechas de creación incorrectas que me gustaría cambiar por lotes a la de los nombres de las carpetas.

He buscado en el foro y he encontrado buena información sobre cómo cambiar la fecha de creación por la del nombre del archivo, pero no he encontrado nada sobre el mismo proceso para utilizar un nombre de carpeta. He utilizado la herramienta de cambio de nombre para poner las carpetas en el formato de fecha correcto para utilizar el comando touch -t y luego estaba tratando de encontrar una manera de utilizar un proceso similar al de este post: leer la fecha de creación a partir del nombre del archivo y cambiarla - por lotes para aplicar el cambio de fecha en bloque a cada archivo.

Los archivos están en una carpeta con una subcarpeta para cada fecha en la que se tomaron. Un ejemplo de nombre de subcarpeta es 2005_09_28 con archivos llamados IMG_0441.jpg, IMG_0445.jpg y MVI_0448.avi en ellos. Me gustaría cambiar la fecha de creación de cada archivo para que coincida con la subcarpeta en la que están.

He mirado de hacerlo mediante el uso de software como 'un mejor buscador' para cambiar el nombre de los archivos y luego utilizar el método en el post mencionado anteriormente, pero me gustaría hacerlo sin cambiar el nombre de los archivos si es posible.

1voto

Suponiendo una estructura simple de dos niveles de carpetas denominadas YYYY-MM-DD y archivos directamente en estas carpetas:

cd PARENT-FOLDER
for d in *; do
    if [[ -d "$d" && "$d" =~ [0-9]{4}_[0-9]{2}_[0-9]{2} ]]; then
        touch -t "$(sed 's/_//g' <<< $d)0000" "$d" "$d"/*
    fi
done

Nota: No hay manejo de errores, esto puede fallar en caso de datos "inesperados" o carpetas vacías.

  • for d in *; do itera sobre todas las entradas de la carpeta
  • -d "$d" comprueba si la entrada actual es realmente un directorio
  • $d =~ [0-9]{4}_[0-9]{2}_[0-9]{2} comprueba si la entrada real coincide con nuestra YYYY-MM-DD patrón
  • $(sed 's/_//g' <<< $d)0000 corre sed en un subsuelo para reemplazar el _ por "nada" para conseguir YYYYMMDD y añade 0000 (medianoche) para la parte del tiempo. Esto también podría escribirse como $(sed -E 's/_(..)_(..)$/\1\20000/g' <<< $d)

Lo anterior cambiará el acceso y la fecha de modificación (que a menudo es suficiente). Si efectivamente quieres cambiar la fecha de creación, tienes que instalar Xcode desde la App Store para conseguir el SetFile utilidad. A continuación, puede ejecutar

cd PARENT-FOLDER
for d in *; do
    if [[ -d "$d" && "$d" =~ [0-9]{4}_[0-9]{2}_[0-9]{2} ]]; then
        SetFile -d "$(sed -E 's|(.*)_(.*)_(.*)|\2/\3/\1 00:00|' <<< $d)" "$d" "$d"/*
    fi
done

0 votos

Quizás podrías añadir que tu sugerencia cambia la hora de modificación y acceso del archivo, mientras que el OP preguntaba por la hora de creación. Tal vez su solución es lo suficientemente bueno para el OP, pero si su respuesta se supone que debe convertirse en una referencia para esta pregunta, es mejor aclarar esto explícitamente.

1 votos

@user1934428 No es tan simple, en realidad, ver apple.stackexchange.com/a/99599/9058 . Pero tienes razón, debería cambiar esto para usar SetFile en su lugar.

0 votos

Definitivamente añadiría el SetFile alternativa a la respuesta. Su inconveniente es que SetFile no está presente por defecto en todos los Mac, mientras que touch se puede suponer que está aquí. Conociendo ambas posibilidades, el PO puede elegir la que mejor se adapte a su situación.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X