NextcloudSNT/collecte_final.sh
2025-08-20 08:30:46 +00:00

153 lines
No EOL
6.1 KiB
Bash

#!/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"