Last active
November 3, 2025 12:50
-
-
Save lahaxearnaud/e5b55863a65204af8bbb8c2795dd9403 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| # ========================================================== | |
| # Tri multi-threadé des photos/vidéos selon métadonnées EXIF | |
| # Auteur : Larno | |
| # Version : 5.1 — Adaptatif selon le nombre de cœurs CPU | |
| # ========================================================== | |
| SRC_DIR="${1:-.}" | |
| DEST_DIR="${2:-$SRC_DIR}" | |
| # Détection automatique du nombre de cœurs | |
| if command -v nproc &>/dev/null; then | |
| CORES=$(nproc) | |
| elif [[ "$OSTYPE" == "darwin"* ]]; then | |
| CORES=$(sysctl -n hw.ncpu) | |
| else | |
| CORES=4 | |
| fi | |
| # L’utilisateur peut surcharger via argument | |
| THREADS="${3:-$CORES}" | |
| LOG_FILE="$DEST_DIR/rapport_tri.log" | |
| # Vérification des dépendances | |
| for cmd in exiftool parallel; do | |
| if ! command -v $cmd &>/dev/null; then | |
| echo "❌ Erreur : '$cmd' n'est pas installé." | |
| echo "Installe-le avec : sudo apt install $cmd" | |
| exit 1 | |
| fi | |
| done | |
| mkdir -p "$DEST_DIR" | |
| echo "📘 Rapport du $(date)" > "$LOG_FILE" | |
| echo "Source : $SRC_DIR" >> "$LOG_FILE" | |
| echo "Destination : $DEST_DIR" >> "$LOG_FILE" | |
| echo "Threads utilisés : $THREADS (auto-détecté sur $CORES cœurs)" >> "$LOG_FILE" | |
| echo "--------------------------------------------------" >> "$LOG_FILE" | |
| shopt -s nullglob | |
| FILES=("$SRC_DIR"/*.{jpg,JPG,jpeg,JPEG,png,PNG,mp4,MP4,mov,MOV,avi,AVI,mkv,MKV,heic,HEIC}) | |
| TOTAL=${#FILES[@]} | |
| if [[ $TOTAL -eq 0 ]]; then | |
| echo "❌ Aucun fichier image/vidéo trouvé dans $SRC_DIR" | |
| exit 1 | |
| fi | |
| echo "⚙️ Démarrage du tri parallèle avec $THREADS threads..." | |
| echo "📂 $TOTAL fichiers à traiter depuis : $SRC_DIR" | |
| echo "--------------------------------------------------" | |
| export DEST_DIR LOG_FILE | |
| process_file() { | |
| FILE="$1" | |
| BASENAME=$(basename "$FILE") | |
| DATE=$(exiftool -s -s -s -DateTimeOriginal "$FILE" 2>/dev/null) | |
| if [[ -z "$DATE" ]]; then | |
| DATE=$(date -r "$FILE" "+%Y:%m:%d %H:%M:%S") | |
| echo "⚠️ $BASENAME — pas de métadonnée EXIF, fallback sur date système" >> "$LOG_FILE" | |
| fi | |
| YEAR=$(echo "$DATE" | cut -d: -f1) | |
| MONTH=$(echo "$DATE" | cut -d: -f2) | |
| [[ "$YEAR" =~ ^[0-9]{4}$ ]] || { echo "❌ $BASENAME — date invalide ($DATE)" >> "$LOG_FILE"; exit 0; } | |
| case "$MONTH" in | |
| 01) MNAME="01_Janvier" ;; | |
| 02) MNAME="02_Février" ;; | |
| 03) MNAME="03_Mars" ;; | |
| 04) MNAME="04_Avril" ;; | |
| 05) MNAME="05_Mai" ;; | |
| 06) MNAME="06_Juin" ;; | |
| 07) MNAME="07_Juillet" ;; | |
| 08) MNAME="08_Août" ;; | |
| 09) MNAME="09_Septembre" ;; | |
| 10) MNAME="10_Octobre" ;; | |
| 11) MNAME="11_Novembre" ;; | |
| 12) MNAME="12_Décembre" ;; | |
| *) MNAME="00_Inconnu" ;; | |
| esac | |
| TARGET_DIR="$DEST_DIR/$YEAR/$MNAME" | |
| mkdir -p "$TARGET_DIR" | |
| if [ -f "$TARGET_DIR/$BASENAME" ]; then | |
| echo "⚠️ Doublon détecté : $BASENAME déjà présent dans $TARGET_DIR" >> "$LOG_FILE" | |
| else | |
| mv -n "$FILE" "$TARGET_DIR/" 2>/dev/null && \ | |
| echo "✅ $BASENAME → $YEAR/$MNAME" >> "$LOG_FILE" || \ | |
| echo "❌ Erreur lors du déplacement : $BASENAME" >> "$LOG_FILE" | |
| fi | |
| } | |
| export -f process_file | |
| # Traitement parallèle avec barre de progression | |
| printf "%s\n" "${FILES[@]}" | parallel -j "$THREADS" --bar process_file {} | |
| echo "--------------------------------------------------" | |
| echo "✅ Tri parallèle terminé." | |
| echo "📄 Rapport : $LOG_FILE" | |
| echo "--------------------------------------------------" |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
⚡ Tri parallèle et sécurisé de photos et vidéos (
tri_photos_parallel_auto.sh)📋 Description
Ce script Bash trie automatiquement vos photos et vidéos dans une arborescence année / mois, à partir des métadonnées EXIF ou, à défaut, de la date de modification du fichier.
Il exploite la puissance multi-cœur de votre machine grâce à GNU Parallel, tout en garantissant une sécurité totale : aucun fichier n’est supprimé ni écrasé.
Ce script est conçu pour gérer efficacement des volumes assez importants (7000+ fichiers) tout en maintenant une progression fluide et un rapport de tri complet.
🚀 Fonctionnalités principales
nprocousysctl).DateTimeOriginal) avec fallback sur la date système.Année/Moisavec noms complets en français.parallel --bar.🔧 Prérequis