cClaude.rocks ☕ Le blog

L'informatique et les nouvelles technologies

Menu

Un petit script bash pour trier vos photos et vos vidéos par année, puis par jour.

Cette méthode est valide pour les photos ayant un nom du type IMG_ suivi de la date au format (aaaammjj en chiffre) puis ayant comme extension .jpg ainsi que pour les vidéos ayant un nom du type VID_ suivi de la date au format (aaaammjj en chiffre) puis ayant comme extension .mp4.

C’est typiquement le format produit par un téléphone Android, mais il est facilement adaptable.

Exemple d’arborescence générée :


├── 2018
│   ├── 2018-02-14
│   ├── 2018-04-02
…   …
│   └── 2018-12-23
├── 2019
│   ├── 2019-01-03
…   …
│   ├── 2019-11-12
…   …
│   └── 2019-12-25
└── 2020
    ├── 2020-01-19
    …
    └── 2020-04-22

Le code complet

Pour lire se code, il faut commencer par la dernière ligne (contenant main) et
ensuite rechercher la fonction main (function main) et ainsi de suite.

Ce code est simpliste (il manque d’optimisations), il correspond à une méthode assez naturelle de faire ce tri manuellement.


#!/bin/bash
#
# sort-media.sh
#
# il faut lancer ce code depuis le répertoire contenant
# les photos et les vidéos non triés
#
function sort_per_month {
  local -r yeardir="$1"
  local    file=
  local    filename=
  local    filedir=
  local    year=
  local    month=
  local    day=
  local    subdir=

  # Lit ligne par ligne le résultat de la recherche.
  # La recherche se trouve à la fin de boucle (do … done).
  while read -r file ; do
    # On prend uniquement le nom du fichier (sans le chemin)
    filename="$( basename "${file}" )"
    # on récupère l'année (saute 4 caractère et en récupère 4)
    year="${filename:4:4}"

    # Petit test pour écarter d’éventuels intrus
    # (mis Ă  la main dans le dossier)
    if [ "${yeardir}" != "${year}" ] ; then
      echo "yeardir=${yeardir} year=${year} filename=${filename}"
      # On arrête tout en cas de problème
      exit 1
    fi
    # Récupère le mois (saute 8 caractères et en récupère 2)
    month="${filename:8:2}"
    # Récupère le mois (saute 10 caractères et en récupère 2)
    day="${filename:10:2}"

    # Nom du répertoire pour le jour du média (format ISO)
    subdir="${year}/${year}-${month}-${day}"

    # Création du répertoire où sera mis le média (s’il n’existe pas)
    mkdir -vp "${subdir}" || exit 1

    # Déplace le média dans le répertoire
    mv -v "${file}" "${subdir}/${filename}"
  done < <( find "${yeardir}" -maxdepth 1 -type f -name 'VID_*.mp4' -or -name 'IMG_*.jpg' )
}

function sort_per_year {
  local -r yeardir="$1"

  mkdir -vp "${yeardir}" # Création du répertoire s’il n’existe pas.
  mv -v "VID_${yeardir}"*.mp4 "${yeardir}/" # Déplace les vidéos de l’année dans le dossier de l’année
  mv -v "IMG_${yeardir}"*.jpg "${yeardir}/" # Déplace les photos de l’année dans le dossier de l’année

  sort_per_month "${yeardir}" # Appel sort_per_month avec l’année
}

function main {
  # Pour les années 2017, 2018, 2019 puis 2020
  for year in $( seq 2017 2020 ) ; do
    echo "${year}"
    sort_per_year "${year}" # Appel sort_per_year avec l’année
  done
}

# Çà commence ici
main # On appelle main sans argument

Bon rangement…

ᦿ


ℹ 2006 - 2020 | 🕸 Retour à l'accueil du domaine | 🏡 Retour à l'accueil du blog