1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| $ cat pm_detect_deps_generate_v2.sh -n
1 #!/bin/bash
2 # pm_detect_deps_generate_v2.sh
3 # Detection des dependances utilisees dans les scripts Bash
4 # Resultats : fm_deps_par_script.csv (par script) fm_deps_global.csv (statistiques globales)
5
6 # Declaration de la table associative pour les statistiques globales
7 declare -A global_counts
8
9 set -euo pipefail
10
11 file_ess="fm_deps_essentielles.txt"
12 file_comp="fm_deps_completes.txt"
13 output_csv="fm_deps_par_script.csv"
14 output_stats="fm_deps_global.csv"
15
16 # Vérifier la presence des fichiers contenant les commandes connues
17 for f in "$file_ess" "$file_comp"; do
18 [[ ! -f "$f" ]] && { echo "❌ Fichier requis manquant : $f"; exit 1; }
19 done
20
21 # Lire les commandes connues (ignorer les commentaires et lignes vides)
22 mapfile -t known_ess < <(grep -v '^#' "$file_ess" | sed '/^$/d')
23 mapfile -t known_comp < <(grep -v '^#' "$file_comp" | sed '/^$/d')
24 known_all=("${known_ess[@]}" "${known_comp[@]}")
25
26 # Fichiers de sortie
27 echo "script;dependencies;count" > "$output_csv"
28 : > "$output_stats"
29
30 # Trouver les scripts à analyser (sans pipe !)
31 while IFS= read -r -d '' script; do
32 [[ ! -f "$script" ]] && continue
33
34 # Nettoyer les lignes : supprimer les commentaires en ligne
35 code_cleaned=$(sed 's/#.*//' "$script")
36
37 found_deps=()
38
39 for cmd in "${known_all[@]}"; do
40 if grep -q -w "$cmd" <<< "$code_cleaned"; then
41 found_deps+=("$cmd")
42 ((global_counts["$cmd"] = global_counts["$cmd"] + 1))
43 #TC global_counts["$cmd"] = global_counts["$cmd"] + 1 # La ligne du dessus provoque une erreur
44 fi
45 done
46
47 [[ ${#found_deps[@]} -eq 0 ]] && continue
48
49 deps_sorted=$(printf "%s\n" "${found_deps[@]}" | sort | tr '\n' ',' | sed 's/,$//')
50 echo "$script;$deps_sorted;${#found_deps[@]}" >> "$output_csv"
51
52 done < <(find . -type f -name "*.sh" -print0)
53
54 # Generer le fichier des statistiques globales
55 {
56 echo "command;count"
57 for cmd in "${!global_counts[@]}"; do
58 echo "$cmd;${global_counts[$cmd]}"
59 done | sort -t';' -k2 -nr
60 } > "$output_stats"
61
62 echo "✅ Détection terminée."
63 echo "→ Fichier par script : $output_csv"
64 echo "→ Fichier global : $output_stats" |
Partager