web-dev-qa-db-fra.com

Réorganiser les photos d'une structure de dossiers existante en une nouvelle structure

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.

1
Zebla

Script pour réorganiser les photos en répertoires/année/mois

Le script ci-dessous fait ce qui suit:

  • Il détermine le mois où la photo a été prise
  • À l'intérieur de votre répertoire cible, il crée (si nécessaire) des sous-répertoires par année (si des photos ont été trouvées)
  • Dans ces répertoires année, il crée des sous-répertoires par mois
  • Si le script ne parvient pas à trouver une date appropriée, il crée un dossier nommé "indéterminé"

Dossiers par an

enter image description here

Sous-dossiers par mois

enter image description here

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
    

Comment utiliser

  1. Le script utilise exif pour lire les métadonnées:

    Sudo apt-get install exif
    
  2. copiez le script ci-dessous dans un fichier vide.

  3. 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"
    #---
    
  4. enregistrez le script sous reorganize.py.

  5. Créez le répertoire ciblé (supérieur) si nécessaire
  6. 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.

Notes IMPORTANTES

  • 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)
    

Le script

#!/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)
2
Jacob Vlijm

Le faire avec un Python Utility

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.

1. Installation

L'installation est aussi simple que d'exécuter pip install sortphotos

2. Utilisation

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

3. Notes supplémentaires

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

0
Amith KK

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.

0
Hannu