Bash importer des photos

Voici un petit script en Bash pour importer, classer et renommer des photos provenant d’un média amovible ou d’un fichier.Une des forces du bash est que nous pouvons réaliser facilement des petits scripts pour effectuer des tâches plus ou moins complexes mais qui sont redondantes. J’ai écrit un petit script afin d’importer, renommer les photos en fonction de leur date de prise de vue et les classer dans des dossiers ANNEE/MOIS.

Pourquoi perdre du temps à le faire alors que plein de solution existe, la réponse est simple :

  • parce que je le peux
  • parce que je le veux
  • surtout, les solutions proposées peuvent être parfois trop lourdes, pour le script, pas d’installation et pas d’action supplémentaire

Script pour importer et classer les photos par date de prise de vue

Tout d’abord, je vous passe le script brute :

#!/bin/bash

#nbr_fichier = 0
for fichier in $(find /media/zigomato/ -regextype posix-extended -regex "^.*\.[JPG|jpg|png|jpeg]*$"); do
#for fichier in $(find temp/ -regextype posix-extended -regex "^.*\.[JPG|jpg|png|jpeg]*$"); do
	let "nbr_fichier+=1"
done

for fichier in $(find /media/zigomato/ -regextype posix-extended -regex "^.*\.[JPG|jpg|png|jpeg]*$"); do
#for fichier in $(find temp/ -regextype posix-extended -regex "^.*\.[JPG|jpg|png|jpeg]*$"); do
	date=$(exiftool -DateTimeOriginal -s -s -s -d "%Y-%m" $fichier)
	annee=$(echo $date | cut -f1 -d-)
	mois=$(echo $date | cut -f2 -d-)
	if [ -d "/home/zigomato/Images/$annee/$mois" ]
	then
		:
	else
		mkdir -p /home/zigomato/Images/$annee/$mois
	fi
	cp -n "$fichier" /home/zigomato/Images/$annee/$mois/$(basename $fichier)
	if [ "$?" -eq "0" ]
	then
		rm $fichier
	fi
	clear
	let "compteur+=1"
	echo $compteur" sur "$nbr_fichier" "$(basename $fichier)

done

Les explications du script

Ces explications valent pour un système tournant avec Linux.

Destination et origine

Tout d’abord, il est important de modifier quelques petites choses pour que cela fonctionne.

Il faut modifier le chemin d’origine (dans notre cas, soit temp/ ou /media/zigomato/, temp/ est un dossier du dossier courant et /media/zigomato/ est l’emplacement de mes médias amovibles pour cette session).

Maintenant pour le dossier de destination, le mien (celui présent dans le script est /home/zigomato/Images/), il suffit de remplacer tous mes chemins par les vôtres.

Choix du dossier d’origine

Au début de chaque boucle for, vous constatez d’ailleurs qu’il y a une ligne qui est commenté, il s’agit de la sélection du dossier d’origine. Un peu grossier j’admets, n’hésitez pas à laisser des commentaires.

Les Régex (expression régulière)

Pour l’exécution des boucles, la boucles est faites sur chaque fichiers qui correspondent à l’expression régulière.

find /media/zigomato/ -regextype posix-extended -regex "^.*\.[JPG|jpg|png|jpeg]*$"

Nous allons récupérer tous les fichiers du dossier /media/zigomato/ (sous-dossiers compris).

  • regextype, permet de définir le type d’expression régulière utilisé (voir cette page)
  • regex, après cette option, entre les guillemets, vous allez y saisir l’expression régulière (voir cette page)

Première boucle for

Cette boucle for permet simplement de compter le nombre de fichiers qui sont concernés, a chaque tour de la boucle, on incrémente la variable nbr_fichier.

Seconde boucle for

La partie la plus complexe du script, on va voir cela en plusieurs points.

Exiftool, récupérer les données d’une photo

Vous allez pouvoir trouver un très bon article sur le site de Korben qui va vous permettre de bien comprendre ce qu’est cet outil.

date=$(exiftool -DateTimeOriginal -s -s -s -d "%Y-%m" $fichier)

Nous allons pouvoir récupérer la date de prise de vue de chaque fichier trouvé.

Contrôle et création des dossiers

La portion de code :

	annee=$(echo $date | cut -f1 -d-)
	mois=$(echo $date | cut -f2 -d-)
	if [ -d "/home/zigomato/Images/$annee/$mois" ]
	then
		:
	else
		mkdir -p /home/zigomato/Images/$annee/$mois
	fi
	cp -n "$fichier" /home/zigomato/Images/$annee/$mois/$(basename $fichier)

Nous récupérons dans un premier l’année et le mois de la prise de vue.

Nous testons ensuite l’existence du dossier (if [ -d « /home/zigomato/Images/$annee/$mois » ] ), si le dossier n’existe pas, nous le créons (mkdir -p /home/zigomato/Images/$annee/$mois ).

Enfin nous copions la photo (cp -n « $fichier » /home/zigomato/Images/$annee/$mois/$(basename $fichier) ).

Suppression du fichier d’origine

Cette partie est optionnelle et vous pouvez les commenter.

Nous allons supprimer le fichier d’origine, seulement si la commande précédente (la copie) s’est passée correctement.

La fin du script affiche simplement où on en est.

J’espère que ce petit script vous sera utile, il est intéressant également si vous avez besoin juste d’un élément du script. N’hésietez pas à partager et commenter cet article.

Laisser un commentaire