web-dev-qa-db-fra.com

linux-Shell: renommer des fichiers en temps de création

Bon matin tout le monde,

pour un site Web, je voudrais renommer les fichiers (images) dans un dossier de "1.jpg, 2.jpg, 3.jpg ..." à "aaaammjj_hhmmss.jpg" - je voudrais donc lire la création fois un ensemble cette fois comme noms pour les images. Quelqu'un a-t-il une idée de comment faire cela, par exemple avec Linux-Shell ou avec imagemagick?

Je vous remercie!

16
Andre

Dénomination basée sur la date du système de fichiers

Dans le shell Linux:

for f in *.jpg
do
    mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"
done

Explication :

  • for f in *.jpg do

    Cela démarre la boucle sur tous les fichiers JPEG. Une caractéristique de cela est qu'il fonctionnera avec tous les noms de fichiers, même ceux avec des espaces, des tabulations ou d'autres caractères difficiles dans les noms.

  • mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"

    Ceci renomme le fichier. Il utilise l'option -r qui indique à date d'afficher la date du fichier plutôt que la date actuelle. La spécification +"%Y%m%d_%H%M%S" indique à date de le formater comme vous l'avez spécifié.

    Le nom du fichier, $f, est placé entre guillemets partout où il est utilisé. Cela garantit que les noms de fichiers impairs ne causeront pas d'erreurs.

    L'option -n de mv indique à move de ne jamais écraser un fichier existant.

  • done

    Ceci termine la boucle.

Pour une utilisation interactive, vous préférerez peut-être que la commande soit sur une seule ligne. Dans ce cas, utilisez:

for f in *.jpg; do mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"; done

Dénomination basée sur la date de création EXIF

Pour nommer le fichier en fonction de la date de création EXIF ​​(au lieu de la date du système de fichiers), nous avons besoin de exiftool ou son équivalent:

for f in *.jpg
do
    mv -n "$f" "$(exiftool -d "%Y%m%d_%H%M%S" -CreateDate "$f" | awk '{print $4".jpg"}')"
done

Explication :

Ce qui précède est assez similaire aux commandes pour la date du fichier, mais avec l'utilisation de exiftool et awk pour extraire l'image EXIF ​​Date de création. 

  • La commande exiftool fournit la date dans un format tel que:

    $ exiftool -d "%Y%m%d_%H%M%S"  -CreateDate sample.jpg
    Create Date                     : 20121027_181338
    

    La date réelle que nous voulons est le quatrième champ de la sortie. 

  • Nous passons la sortie exiftool à awk afin qu’elle puisse extraire le champ que nous voulons:

    awk '{print $4".jpg"}'
    

    Cela sélectionne le champ de date et ajoute également l'extension .jpg.

32
John1024

Essaye ça

for file in `ls -1 *.jpg`; do name=`stat -c %y $file | awk -F"." '{ print $1 }' | sed -e "s/\-//g" -e "s/\://g" -e "s/[ ]/_/g"`.jpg; mv $file $name; done

Bien qu'il puisse y avoir un moyen plus facile.

1
Ashish Gaur