#!/bin/bash # ========================================== # Fonctions utilitaires # ========================================== echo "AVANT D UTILISER VOIR LE PB DU FAIT QUE CA FAIT A LA SUITE AU LIEU DE DOUBLER LES NUM EXISTANT" echo "Ex E01 => E01-E02 / E02 => E03-E04 / E04 => E07-E08 actuellement E05-E06" exit # Extrait le nom de la série depuis un nom de fichier. # Exemple : # "Adventure Time - S02E01.mkv" -> "Adventure Time" extract_series_name() { local filename="$1" local basename="${filename%.*}" if [[ "$basename" =~ ^(.+)[[:space:]]-[[:space:]]S[0-9]{1,2}E[0-9]{1,3} ]]; then echo "${BASH_REMATCH[1]}" fi } # Extrait le numéro de saison depuis un nom de fichier. # Exemple : # "Adventure Time - S02E01.mkv" -> "2" extract_season() { local filename="$1" if [[ "$filename" =~ [Ss]([0-9]{1,2})[Ee][0-9]{1,3} ]]; then # Supprime les zéros initiaux (02 -> 2) echo $((10#${BASH_REMATCH[1]})) fi } # Retourne la valeur si tous les éléments sont identiques. # Sinon retourne une chaîne vide. get_uniform_value() { local values=("$@") local first="${values[0]}" [ -z "$first" ] && return 1 for value in "${values[@]}"; do [ "$value" != "$first" ] && return 1 done echo "$first" } # Demande une valeur non vide à l'utilisateur. # Si une valeur par défaut est fournie, Entrée seule l'utilise. prompt_required() { local label="$1" local default="$2" local value while true; do if [ -n "$default" ]; then read -rp "$label [$default] : " value value="${value:-$default}" else read -rp "$label : " value fi if [ -n "$value" ]; then echo "$value" return fi echo "Cette valeur est obligatoire." done } # Génère le nouveau nom de fichier. generate_filename() { local index="$1" local original_file="$2" local extension="${original_file##*.}" local ep1=$((index * 2 - 1)) local ep2=$((index * 2)) printf "%s - S%02dE%02d-E%02d.%s" \ "$SERIE" "$SAISON" "$ep1" "$ep2" "$extension" } # Demande confirmation. confirm() { local response read -rp "Continuer ? [y/N] : " response [[ "$response" =~ ^[Yy]$ ]] } # ========================================== # Recherche des fichiers # ========================================== shopt -s nullglob FILES=( *.* ) if [ ${#FILES[@]} -eq 0 ]; then echo "Aucun fichier trouvé dans : $(pwd)" exit 1 fi # ========================================== # Détection automatique # ========================================== SERIES_FOUND=() SEASONS_FOUND=() for file in "${FILES[@]}"; do series="$(extract_series_name "$file")" season="$(extract_season "$file")" [ -n "$series" ] && SERIES_FOUND+=("$series") [ -n "$season" ] && SEASONS_FOUND+=("$season") done DEFAULT_SERIE="$(get_uniform_value "${SERIES_FOUND[@]}")" DEFAULT_SAISON="$(get_uniform_value "${SEASONS_FOUND[@]}")" # ========================================== # Informations de détection # ========================================== echo "Répertoire courant : $(pwd)" echo "Nombre de fichiers trouvés : ${#FILES[@]}" echo if [ -z "$DEFAULT_SERIE" ]; then echo "Le nom de série n'a pas pu être détecté de manière uniforme." else echo "Nom de série détecté : $DEFAULT_SERIE" fi if [ -z "$DEFAULT_SAISON" ]; then echo "Le numéro de saison n'a pas pu être détecté de manière uniforme." else echo "Saison détectée : $DEFAULT_SAISON" fi echo # ========================================== # Saisie utilisateur # ========================================== SERIE="$(prompt_required "Nom de la série" "$DEFAULT_SERIE")" SAISON="$(prompt_required "Numéro de saison" "$DEFAULT_SAISON")" # Validation numérique if ! [[ "$SAISON" =~ ^[0-9]+$ ]]; then echo "Le numéro de saison doit être un entier positif." exit 1 fi # ========================================== # Aperçu # ========================================== FIRST_FILE="${FILES[0]}" FIRST_NEW_NAME="$(generate_filename 1 "$FIRST_FILE")" echo echo "Exemple de renommage :" echo " '$FIRST_FILE'" echo " ->" echo " '$FIRST_NEW_NAME'" echo # ========================================== # Confirmation # ========================================== if ! confirm; then echo "Opération annulée." exit 0 fi # ========================================== # Renommage # ========================================== echo echo "Renommage en cours..." INDEX=1 for file in "${FILES[@]}"; do new_name="$(generate_filename "$INDEX" "$file")" if [ -e "$new_name" ]; then echo "Ignoré (fichier existant) : '$new_name'" else mv -- "$file" "$new_name" echo "'$file' -> '$new_name'" fi ((INDEX++)) done echo echo "Terminé."