From ac4ad215ed0f45505b90e510942bb1f7e2d6ef53 Mon Sep 17 00:00:00 2001 From: lprik Date: Wed, 20 Aug 2025 08:30:46 +0000 Subject: [PATCH] Ajouter collecte_final.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit première version --- collecte_final.sh | 153 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 collecte_final.sh diff --git a/collecte_final.sh b/collecte_final.sh new file mode 100644 index 0000000..9c5ba2a --- /dev/null +++ b/collecte_final.sh @@ -0,0 +1,153 @@ +#!/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" \ No newline at end of file