6 votos

¿Cómo renombrar ficheros por lotes a través del Terminal utilizando la fecha del fichero como nombre?

Tengo un montón de fotos y videos de diferentes fuentes y quiero normalizar los nombres de archivo utilizando Terminal. Miré a un montón de diferentes herramientas de Cambiador de nombre a Automator y al propio Finder. NameChanger no permite más de una acción a la vez y Finder y Automator no me permiten establecer el formato de fecha con una cadena de formato.

He estado jugando con algunas funciones de bash y he descubierto que

stat -f "%Sm" -t "%Y-%m-%d %H.%M.%S" file.ext

produce el formato de fecha y hora que busco.

Sin embargo, descubrí que

for file in *.*
do
    mv "$file" echo stat -f "%Sm" -t "%Y-%m-%d %H.%M.%S" "$file"
done

devuelve

-bash: syntax error near unexpected token `done'

No soy muy competente con bash scripting así que disculpa cualquier incompetencia en los ejemplos anteriores.

Lo que quiero hacer es eliminar todo el nombre base del archivo (todo lo que precede a .jpg) y sustituirlo por el formato de fecha y hora que obtuve de stat antes.

Por ejemplo:

20160708_151344000_iOS.jpg   --> 2016-07-08 15.13.44.jpg
WP_20140915_02_03_15_Raw.jpg --> 2014-09-15 02.03.15.jpg

¿Cómo tengo que hacerlo?

0 votos

¿Desea que el nombre de archivo movido se cree a partir del resultado de la operación stat comando en su OP, o a partir de la información contenida en el propio nombre del archivo?

0 votos

Quiero leer el valor de la fecha del archivo desde el sistema de archivos y utilizarlo como nombre de archivo. Después de publicar la pregunta, sin embargo, me di cuenta de que la fecha del sistema de archivos, fecha EXIF y la fecha que ya está en el nombre del archivo (no normalizado) difieren entre sí para algunos archivos. Pero ser capaz de hacer el cambio de nombre de la fecha del sistema de archivos por sí sola es útil para mí, sin embargo, en caso de que sólo tiene la línea de comandos para trabajar.

0 votos

¿Estás seguro de que realmente quieres *.* ? En DOS esto coincide con todos los archivos, pero en Bash (y en general todos los shells Unix) coincide con todos los nombres de archivo que contienen un punto literal.

7voto

user3439894 Puntos 5883
for f in *.*; do 
    echo mv "$f" "$(stat -f '%Sm' -t '%Y-%m-%d %H.%M.%S' "$f").${f##*.}"
done

O como una frase hecha:

for f in *.*; do echo mv "$f" "$(stat -f '%Sm' -t '%Y-%m-%d %H.%M.%S' "$f").${f##*.}"; done

En ambos casos, retire el echo comando después de la prueba.

En ${f##*.} parte del comando obtener el extensión de $f para que pueda utilizar el glob *.* frente al uso de un extensión en el for f in es decir for f in *.* vs. for f in *.jpg

3voto

for f in *.jpg; do
    echo mv "$f" "$(stat -f '%Sm' -t '%Y-%m-%d %H.%M.%S' "$f")".jpg
done

Retire el echo una vez que esté seguro de que el comando se ve bien.

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