-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrm_node_modules.sh
More file actions
120 lines (104 loc) · 3.56 KB
/
rm_node_modules.sh
File metadata and controls
120 lines (104 loc) · 3.56 KB
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/bin/bash
DRY_RUN=false
VERBOSE=false
EXCLUDE_PATHS=()
show_help() {
echo -e "\033[1mУдаление node_modules\033[0m"
echo "Использование: $0 [опции]"
echo ""
echo -e "\033[1mОпции:\033[0m"
echo " --dry-run Только показать, что будет удалено (не удалять фактически)"
echo " -v, --verbose Подробный вывод (показывать размеры папок)"
echo " --exclude LIST Исключить папки (через запятую)"
echo " -h, --help Показать эту справку"
echo ""
echo -e "\033[1mПримеры:\033[0m"
echo " $0 --dry-run --verbose"
echo " $0 --exclude \"important,test dir\""
echo " $0 -v --exclude \"project alpha\""
exit 0
}
while [[ "$#" -gt 0 ]]; do
case $1 in
-h|--help)
show_help
;;
--dry-run)
DRY_RUN=true
;;
-v|--verbose)
VERBOSE=true
;;
--exclude)
shift
while IFS= read -r -d ',' path; do
cleaned_path=$(echo "$path" | xargs)
[[ -n "$cleaned_path" ]] && EXCLUDE_PATHS+=("$cleaned_path")
done <<< "$1,"
;;
*)
echo -e "\033[31mОшибка: Неизвестный параметр: $1\033[0m"
echo "Используйте $0 --help для просмотра справки"
exit 1
;;
esac
shift
done
should_exclude() {
local dir="$1"
for pattern in "${EXCLUDE_PATHS[@]}"; do
if [[ "$dir" == *"$pattern"* ]]; then
$VERBOSE && echo "ℹ️ Исключено: '$dir' (совпадение с шаблоном: '$pattern')"
return 0
fi
done
return 1
}
echo "🔍 Поиск папок node_modules..."
dirs=()
while IFS= read -r -d $'\0' dir; do
if ! should_exclude "$dir"; then
dirs+=("$dir")
fi
done < <(find . -name "node_modules" -type d -prune -print0)
count=${#dirs[@]}
if [ "$count" -eq 0 ]; then
echo "ℹ️ Папок node_modules не найдено."
exit 0
fi
echo "✅ Найдено папок для обработки: $count"
if $DRY_RUN; then
echo "🚀 Режим dry-run (никакие файлы не будут удалены)"
echo "----------------------------------------"
for dir in "${dirs[@]}"; do
echo "[dry-run] Найдено: '$dir'"
if $VERBOSE; then
du -sh "$dir" | awk '{print " Размер: "$1}'
fi
done
echo "----------------------------------------"
echo "ℹ️ В реальном режиме было бы удалено: $count папок"
else
echo "🗑️ Начинаю удаление..."
echo "----------------------------------------"
deleted=0
total_size=0
for dir in "${dirs[@]}"; do
echo "Удаляю: '$dir'"
if $VERBOSE; then
size=$(du -sh "$dir" | awk '{print $1}')
echo " Размер: $size"
total_size=$((total_size + $(du -s "$dir" | awk '{print $1}')))
fi
rm -rf "$dir"
((deleted++))
echo "Прогресс: $deleted/$count"
echo "----------------------------------------"
done
echo "✨ Готово!"
echo "Удалено папок: $deleted/$count"
if $VERBOSE; then
echo "Общий освобожденный объем: $(numfmt --to=iec-i --suffix=B --format="%.2f" $((total_size * 1024)))"
fi
fi
exit 0