#!/bin/bash # collecte_final.sh - Version finale avec MD5 + espaces + compteur NEXTCLOUD_DATA="/var/www/html/nextcloud/data" PROF_USERNAME="profsnt" DATE=$(date +%Y-%m-%d_%H-%M) CSV_FILE="${1:-eleves_test.csv}" echo "🔄 Collecte SNT finale (MD5 + versions + espaces) - $(date)" total_collectes=0 # Rescan élèves echo "🔍 Rescan de tous les élèves..." while IFS=',' read -r classe nom prenom email motdepasse; do [[ "$classe" = "Classe" ]] && continue username="${prenom,,}.${nom,,}" sudo -u www-data php /var/www/html/nextcloud/occ files:scan "$username" > /dev/null 2>&1 done < "$CSV_FILE" echo "✅ Rescan terminé" echo "📋 Collecte des fichiers (30 dernières minutes)..." while IFS=',' read -r classe nom prenom email motdepasse; do [[ "$classe" = "Classe" ]] && continue username="${prenom,,}.${nom,,}" eleve_snt_dir="$NEXTCLOUD_DATA/$username/files/SNT" prof_rendus_dir="$NEXTCLOUD_DATA/$PROF_USERNAME/files/Classes_SNT/$classe/Rendus" [[ ! -d "$eleve_snt_dir" ]] && continue compteur_eleve=0 # GESTION CORRECTE DES ESPACES avec find -print0 find "$eleve_snt_dir" \( -name "*.docx" -o -name "*.txt" \) -mmin -30 -type f -print0 | \ while IFS= read -r -d '' fichier; do # Extraire la structure chemin_relatif="${fichier#$eleve_snt_dir/}" sequence=$(echo "$chemin_relatif" | cut -d'/' -f1) activite=$(echo "$chemin_relatif" | cut -d'/' -f2) nom_fichier=$(basename "$fichier") # Nettoyer le nom : enlever versions nom_base_clean=$(echo "$nom_fichier" | sed -E 's/[_\-\ ]?v[0-9]+(\.[^.]*)?$/\1/' | sed 's/\.[^.]*$//') extension=$(echo "$nom_fichier" | sed 's/.*\.//') if [[ "$nom_base_clean" == "" ]]; then nom_base_clean=$(echo "$nom_fichier" | sed 's/\.[^.]*$//') fi # Créer structure dans Rendus dest_dir="$prof_rendus_dir/$sequence/$activite" mkdir -p "$dest_dir" # HISTORIQUE : Trouver la prochaine version - CORRECTION ESPACES derniere_version=0 # DEBUG : Afficher le pattern de recherche echo " 🔍 Recherche pattern : ${username}_${nom_base_clean}_v*.${extension}" # Méthode robuste avec find au lieu de glob while IFS= read -r -d '' fichier_existant; do if [[ -f "$fichier_existant" ]]; then echo " 📄 Trouvé : $(basename "$fichier_existant")" num_version=$(basename "$fichier_existant" | grep -o '_v[0-9]*' | sed 's/_v//') echo " 🔢 Version extraite : $num_version" if [[ -n "$num_version" && $num_version -gt $derniere_version ]]; then derniere_version=$num_version fi fi done < <(find "$dest_dir" -name "${username}_${nom_base_clean}_v*.${extension}" -print0 2>/dev/null) # Détection version élève if [[ "$nom_fichier" =~ _v([0-9]+) ]] || [[ "$nom_fichier" =~ [\ \-]v([0-9]+) ]]; then version_eleve="${BASH_REMATCH[1]}" echo " 📌 Élève version ${version_eleve} : $username/$sequence/$activite/$nom_fichier" else echo " 📄 Sans version : $username/$sequence/$activite/$nom_fichier" fi # Nouvelle version pour l'historique nouvelle_version=$((derniere_version + 1)) dest_file="$dest_dir/${username}_${nom_base_clean}_v${nouvelle_version}.${extension}" echo " 🔢 Collecté comme version ${nouvelle_version} : ${nom_base_clean}_v${nouvelle_version}.${extension}" echo " 🎯 Dernière version trouvée : $derniere_version" # TEST MD5 ANTI-DOUBLON should_collect=true if [[ $derniere_version -gt 0 ]]; then fichier_precedent="$dest_dir/${username}_${nom_base_clean}_v${derniere_version}.${extension}" if [[ -f "$fichier_precedent" ]]; then md5_source=$(md5sum "$fichier" | cut -d' ' -f1) md5_precedent=$(md5sum "$fichier_precedent" | cut -d' ' -f1) echo " 🔍 Test MD5 : source=$md5_source vs precedent=$md5_precedent" if [[ "$md5_source" == "$md5_precedent" ]]; then should_collect=false echo " ↔️ Identique à v${derniere_version} : pas de nouvelle version" else echo " 🆕 Différent de v${derniere_version} : collecte justifiée" fi else echo " 📄 Pas de version précédente trouvée" fi else echo " 🎯 Premier fichier pour cet élève" fi # COLLECTE if [[ "$should_collect" == "true" ]]; then cp "$fichier" "$dest_file" echo " ✅ Collecté : $username/$sequence/$activite/$(basename "$dest_file")" # COMPTEUR via fichier temporaire global echo "1" >> "/tmp/collecte_count_$$" # Compteur élève via fichier temporaire local echo "1" >> "/tmp/collecte_eleve_${username}_$$" fi done # Compter pour cet élève if [[ -f "/tmp/collecte_eleve_${username}_$$" ]]; then compteur_eleve=$(wc -l < "/tmp/collecte_eleve_${username}_$$") rm -f "/tmp/collecte_eleve_${username}_$$" fi [[ $compteur_eleve -gt 0 ]] && echo "📄 $compteur_eleve fichier(s) collecté(s) pour $username ($classe)" done < "$CSV_FILE" # Compter le total if [[ -f "/tmp/collecte_count_$$" ]]; then total_collectes=$(wc -l < "/tmp/collecte_count_$$") rm -f "/tmp/collecte_count_$$" fi # Permissions et rescan final echo "🔧 Application des permissions..." chown -R www-data:www-data "$NEXTCLOUD_DATA/$PROF_USERNAME/files/Classes_SNT" echo "🔄 Rescan des fichiers prof..." sudo -u www-data php /var/www/html/nextcloud/occ files:scan "$PROF_USERNAME" > /dev/null 2>&1 echo "" echo "✅ Collecte finale terminée - $(date)" echo "📊 Résumé: $total_collectes fichier(s) collecté(s) au total"