J'ai un répertoire de photoys qui a été (ré) organisé auparavant dans une structure de répertoire: Année/Mois/Jour.
Mis à part le fait que ce n'est pas un regroupement pratique pour moi, il contient des erreurs. Par exemple; dans mon dossier de 2007 il y a des photos de 2010.
Je sais qu'il existe des programmes (tels que Shotwell) pour organiser les photos, mais ils ont du mal avec le grand nombre d'images que j'ai, et ils semblent également tous maintenir la structure de fichiers existante.
Ce que je voudrais faire, c'est retirer toutes les photos de leurs dossiers et les réorganiser correctement selon la structure: Année/Mois. Cela me permettrait de naviguer facilement et de les regrouper dans des albums.
Y aurait-il une façon idiote de le faire? De plus, un lien vers une discussion de forum utile à ce sujet pourrait m'aider beaucoup.
Le script ci-dessous fait ce qui suit:
Dossiers par an
Sous-dossiers par mois
Gestion des doublons:
Une chose importante est de prendre soin des doublons de manière appropriée: les appareils photo numériques prennent des photos dans des séries du même nom (comme IMG_1.jpeg
, IMG_2.jpeg
etc). Par conséquent, les doublons doivent être renommés automatiquement, ou bien le script se cassera ou un grand nombre de photos seront perdues.
Le script renomme les doublons comme:
IMG_1.jpeg, duplicate_1_IMG_1.jpeg, duplicate_2_IMG_1.jpeg etc
Le script utilise exif
pour lire les métadonnées:
Sudo apt-get install exif
copiez le script ci-dessous dans un fichier vide.
Dans la section head du script, définissez le répertoire où vous voulez que les photos soient copiées (répertoire ciblé):
#---
save_to = "/targeted/directory"
#---
enregistrez le script sous reorganize.py
.
Exécutez le script, avec le répertoire source (le dossier avec vos photos) comme argument, par la commande:
python3 /path/to/reorganize.py <source_directory>
J'ai créé le répertoire cible défini dans le script, car vous souhaiterez peut-être ajouter d'autres dorectories (nouvelles images) au même répertoire, organisées automatiquement, tandis que le répertoire source sera différente dans les situations futures.
Le format dat peut différer légèrement par caméra. Dans le script, j'ai pris en compte les formats suivants:
Datum en tijd |2013:08:18 15:58:46
et
Datum en tijd |2013-08-18 20:21:32
Cela pourrait être différent sur d'autres caméras. Si le script ne fonctionne pas correctement, vous devez publier la sortie de la commande exif <image>
, mais très probablement, cela fonctionnera comme il se doit.
Le script tel qu'il est copies les photos dans les nouvelles (sous-) répertoires, car vous ne voudrez probablement pas jouer avec le répertoire d'origine avant d'avoir vérifié que tout s'est bien passé. Si vous souhaitez déplacer les fichiers, remplacez la ligne:
shutil.copyfile(file, newfile)
par:
shutil.move(file, newfile)
#!/usr/bin/env python3
import subprocess
import os
import sys
import shutil
#---
save_to = "/targeted/directory"
#---
directory = sys.argv[1]
if not os.path.exists(save_to):
os.mkdir(save_to)
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def check_dir(dr):
if not os.path.exists(dr):
os.mkdir(dr)
def rename_dups(target_dir, name):
n = 1; name_orig = name
while os.path.exists(target_dir+"/"+name):
name = "duplicate_"+str(n)+"_"+name_orig
n = n+1
return target_dir+"/"+name
for root, dirs, files in os.walk(directory):
for name in files:
file = root+"/"+name
try:
date = [l for l in get("exif "+'"'+file+'"').splitlines()\
if "Dat" in l][0].split("|")[1].split()[0]
if "-" in date:
date = date.split("-")[:2]
Elif ":" in date:
date = date.split(":")[:2]
targeted_dir = save_to+"/"+date[0]
check_dir(targeted_dir)
sub_dir = targeted_dir+"/"+date[1]
except:
sub_dir = save_to+"/"+"undetermined"
check_dir(sub_dir)
newfile = rename_dups(sub_dir, name)
shutil.copyfile(file, newfile)
Un outil a été créé par @ andrewning dans ce but précis, vous permettant de vous en occuper, ainsi que tous les cas Edge que vous rencontrez.
L'installation est aussi simple que d'exécuter pip install sortphotos
Une fois installé, il existe sous la forme d'une commande appelée par sortphotos
. Afin de trier les photos selon ce que vous voulez dans la question, exécutez-le simplement comme
sortphotos -r ./source ./destination --sort %Y/%m-%b
Voici la chaîne de format donnée par --sort
détermine la structure dans laquelle les photos du répertoire source
sont organisées dans le répertoire destination
, ici il trie les fichiers comme indiqué ci-dessous:
La chaîne de format peut être spécifiée comme utilisée dans la spécification strftime
avec /
(barres obliques) séparant les sous-répertoires
Toute collision de noms (c'est-à-dire deux photos avec le même nom dans le même mois) sera automatiquement associée à un numéro. Si vous voulez simplement simuler le mouvement des fichiers pour voir si tout est en ordre, utilisez simplement le -t
drapeau comme suit:
sortphotos -tr ./source ./destination --sort %Y/%m-%b
Tous les fichiers n'ayant pas de données EXIF valides sont stockés dans un sous-dossier intitulé Unknown
par défaut mais peuvent être modifiés par l'option --unknown-dir
http://owl.phy.queensu.ca/~phil/exiftool/
Téléchargez le package.
Trouvez "Instructions d'installation" ( http://owl.phy.queensu.ca/~phil/exiftool/install.html )
Script bash non testé, utilisant "exiftool" ci-dessus.
$ cat exifto #!/bin/bash exiftool -r\ - d $ HOME/Pictures/Original_Images /% Y/% m /% d/%% f. %% e\ "-nomfichier <filemodifydate"\ /media/MEMORY_CARD/DCIM/[.____.
Exiftool peut faire bien plus que cela.