Skip to content

Instantly share code, notes, and snippets.

@lahaxearnaud
Last active November 3, 2025 12:50
Show Gist options
  • Select an option

  • Save lahaxearnaud/e5b55863a65204af8bbb8c2795dd9403 to your computer and use it in GitHub Desktop.

Select an option

Save lahaxearnaud/e5b55863a65204af8bbb8c2795dd9403 to your computer and use it in GitHub Desktop.
#!/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 "--------------------------------------------------"
@lahaxearnaud
Copy link
Author

lahaxearnaud commented Nov 3, 2025

⚡ 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

  • ⚙️ Multithreading adaptatif — détecte automatiquement le nombre de cœurs CPU (nproc ou sysctl).
  • 🔒 Copie/mouvement sécurisé — aucun écrasement de fichiers existants.
  • 🧠 Analyse intelligente des métadonnées EXIF (DateTimeOriginal) avec fallback sur la date système.
  • 🗂️ Organisation hiérarchique : Année/Mois avec noms complets en français.
  • 📈 Affichage d’une barre de progression en temps réel grâce à parallel --bar.
  • 🧾 Rapport détaillé dans un fichier log : doublons, erreurs, fichiers sans EXIF.
  • 💡 Exécution ultra-rapide — exploite tous les cœurs disponibles sans surcharge.

🔧 Prérequis

  • Système : Linux / macOS / WSL
  • Dépendances :
    sudo apt install libimage-exiftool-perl parallel

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment