Digamos que tengo un montón de fotos, todas con información EXIF correcta, y las fotos se nombran al azar (debido a un problema que tuve). Tengo un pequeño programa llamado jhead
que me da el siguiente resultado:
$ jhead IMG_9563.JPG
File name : IMG_9563.JPG
File size : 638908 bytes
File date : 2011:02:03 20:25:09
Camera make : Canon
Camera model : Canon PowerShot SX210 IS
Date/Time : 2011:02:03 20:20:24
Resolution : 1500 x 2000
Flash used : Yes (manual)
Focal length : 5.0mm (35mm equivalent: 29mm)
CCD width : 6.17mm
Exposure time: 0.0080 s (1/125)
Aperture : f/3.1
Focus dist. : 0.29m
ISO equiv. : 125
Exposure bias: -1.67
Whitebalance : Manual
Light Source : Daylight
Metering Mode: pattern
Exposure Mode: Manual
Ahora necesito cambiar el nombre de todas las fotos en la carpeta en el siguiente formato:
001.JPG
002.JPG
003.JPG
...
Donde el número menor sería la imagen más antigua y el máximo el más nuevo.
No soy tan bueno escribiendo guiones, así que estoy pidiendo ayuda.
Creo que un script bash es suficiente, pero si te sientes más cómodo, puedes escribir un script python.
Pensé en algo como:
$ mv IMG_9563.JPG `jhead IMG_9563.JPG | grep date`
pero no sé cómo hacer eso para todos los archivos a la vez.
ls *.JPG | wc > rename
Y luego tendría que usar un cambio de nombre de script a XXX.JPGwc
, olvidé el que ordenar por nombre.Respuestas:
Puede hacerlo para todos los archivos usando un bucle for (en el shell / en un script de shell):
Este es solo un esquema muy básico. Elimine
echo
cuando haya verificado que todo funciona como se esperaba.fuente
File date : 2011:02:03 20:25:09
. ¿Cómo puedo filtrar solo la segunda columna?j=`jhead "$i" | grep date | sed 's/.* //'`.jpg
¿en lugar?'
antes `` .jpg`Acaba de enterarse de aquí que jhead puede hacerlo todo para usted! :)
fuente
%i
(o%03i
, específicamente) dará un número de secuencia, según lo solicitado en la pregunta original. Combinar ambos podría no ser una mala idea.Si alguien necesita un cambio de nombre más complejo, por ejemplo, para incluir valores de exposición clave en el nombre del archivo, aquí está mi pequeño script. Se cambia el nombre de los archivos JPEG a algo como esto:
NightSky_2014.08.27_22.30.05_NX20_F2.8_f20.0mm_20s_ISO800.jpg
.fuente
Me gustó el código publicado por maxschlepzig pero no obstante tuve dificultades con la salida.
El problema era el espacio en el nombre de archivo resultante (entre la cadena de fecha y la cadena de tiempo). Si bien es trivial para cualquiera que use una GUI, dificulta el manejo de archivos en la línea de comandos.
Aquí el comando 'sed' se ha cambiado sustancialmente a cuatro operaciones 'sed' separadas a favor del argumento monolítico anterior. Para adaptarme a mí mismo, lo siguiente también cambia el archivo a los permisos 644 normales.
fuente
sed
bastante bien, así que básicamente entiendo lo que estás tratando de hacer. Pero nuestro objetivo en Stack Exchange no es entregar sándwiches de pescado o escribir miles de soluciones únicas para preguntas trivialmente distintas; Nuestro objetivo es enseñar a las personas cómo pescar (es decir, enseñarles a las personas, incluidos el interrogador actual y los futuros lectores, cómo resolver sus propios problemas). Con ese fin, su respuesta sería mejor si explicara lo que está haciendo. (Por favor, no responde en los comentarios; editar su respuesta para que sea más claro.) ... (Continuación)Debido a que es más fácil tratar (en mi humilde opinión), escribí un script de Ruby:
¿Qué hace esto?
Itera sobre todos los archivos pasados como parámetros (por ejemplo
*.JPG
).Verifiqué que maneja archivos RAW y videos correctamente. Debería funcionar con todo lo que
exiftool
pueda manejar.No hace nada si un archivo
exiftool
informa un error, oEso lo hace bastante robusto. En particular, ningún archivo puede desaparecer (en silencio) como es el caso con algunas de las otras respuestas.
fuente
exiv2
sería una alternativa para manipular, que permite una sintaxis muy simple:Entonces, esto cambiaría el nombre de todos los archivos JPEG en la carpeta actual:
Si también desea agregar información geográfica, puede usar
exivtool
:fuente
Me gusta la solución de @ Kevin, ya que también quería mantener el nombre original (evitando problemas con las imágenes tomadas en el mismo segundo), aquí está mi solución:
fuente
Primera publicación por novato ... Primer script bash ... Me gustó la solución Libor / HalosGhost anterior, ya que incluía más detalles en el cambio de nombre. Pero después de la prueba, los nombres de archivos duplicados terminarían perdiendo archivos. Así que agregué una etiqueta de contador al final del nombre de archivo para una fácil referencia y prevención de colisiones. Estoy seguro de que alguien aquí puede mejorar esto, pero pensé que podría ayudar.
Mis disculpas por publicar el código. Tengo dificultades con la interfaz, pero si alguien pudiera indicarme cómo corregir las cosas, sería genial.
fuente