Initial commit: local_machine docs and scripts
This commit is contained in:
190
docs/disk_cleanup/scripts/compress-screenrecordings.sh
Executable file
190
docs/disk_cleanup/scripts/compress-screenrecordings.sh
Executable file
@@ -0,0 +1,190 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Скрипт для сжатия видео ScreenRecordings без потери качества
|
||||
# Использует H.265 (HEVC) кодек с CRF 18 (визуально без потерь)
|
||||
|
||||
SCREENRECORDINGS_DIR="$HOME/Library/ScreenRecordings"
|
||||
BACKUP_DIR="$SCREENRECORDINGS_DIR/originals"
|
||||
TEMP_DIR="$SCREENRECORDINGS_DIR/compressed"
|
||||
|
||||
# Цвета для вывода
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
echo "=========================================="
|
||||
echo " Сжатие ScreenRecordings без потери качества"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# Проверка наличия ffmpeg
|
||||
if ! command -v ffmpeg &> /dev/null; then
|
||||
echo -e "${RED}Ошибка: ffmpeg не установлен${NC}"
|
||||
echo "Установите ffmpeg: brew install ffmpeg"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Проверка существования директории
|
||||
if [ ! -d "$SCREENRECORDINGS_DIR" ]; then
|
||||
echo -e "${RED}Ошибка: директория $SCREENRECORDINGS_DIR не найдена${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Создание директорий для бэкапа и временных файлов
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
mkdir -p "$TEMP_DIR"
|
||||
|
||||
# Подсчет видео файлов
|
||||
VIDEO_FILES=$(find "$SCREENRECORDINGS_DIR" -maxdepth 1 -type f \( -iname "*.mov" -o -iname "*.mp4" -o -iname "*.m4v" \) ! -name ".*" | wc -l | tr -d ' ')
|
||||
|
||||
if [ "$VIDEO_FILES" -eq 0 ]; then
|
||||
echo -e "${YELLOW}Видео файлы не найдены в $SCREENRECORDINGS_DIR${NC}"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}Найдено видео файлов: $VIDEO_FILES${NC}"
|
||||
echo ""
|
||||
|
||||
# Подсчет общего размера
|
||||
TOTAL_SIZE=$(du -sh "$SCREENRECORDINGS_DIR" 2>/dev/null | cut -f1)
|
||||
echo -e "Текущий размер: ${YELLOW}$TOTAL_SIZE${NC}"
|
||||
echo ""
|
||||
|
||||
# Подтверждение
|
||||
read -p "Продолжить сжатие? (y/n): " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "Отменено"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Начало сжатия..."
|
||||
echo ""
|
||||
|
||||
# Счетчики
|
||||
PROCESSED=0
|
||||
SKIPPED=0
|
||||
ERRORS=0
|
||||
|
||||
# Создание массива видео файлов
|
||||
mapfile -t video_files < <(find "$SCREENRECORDINGS_DIR" -maxdepth 1 -type f \( -iname "*.mov" -o -iname "*.mp4" -o -iname "*.m4v" \) ! -name ".*" | sort)
|
||||
|
||||
# Обработка каждого видео файла
|
||||
for video_file in "${video_files[@]}"; do
|
||||
filename=$(basename "$video_file")
|
||||
name_without_ext="${filename%.*}"
|
||||
ext="${filename##*.}"
|
||||
|
||||
# Пропускаем уже обработанные файлы
|
||||
if [[ "$filename" == *"_compressed"* ]] || [ -f "$BACKUP_DIR/$filename" ]; then
|
||||
echo -e "${YELLOW}Пропуск: $filename (уже обработан)${NC}"
|
||||
((SKIPPED++))
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "----------------------------------------"
|
||||
echo -e "${GREEN}Обработка: $filename${NC}"
|
||||
|
||||
# Размер оригинального файла
|
||||
original_size=$(stat -f%z "$video_file" 2>/dev/null || stat -c%s "$video_file" 2>/dev/null)
|
||||
original_size_mb=$(echo "scale=2; $original_size / 1024 / 1024" | bc)
|
||||
echo " Размер оригинала: ${original_size_mb} MB"
|
||||
|
||||
# Временный файл для сжатого видео
|
||||
compressed_file="$TEMP_DIR/${name_without_ext}_compressed.${ext}"
|
||||
|
||||
# Сжатие с H.265 (HEVC) кодеком
|
||||
# CRF 18 = визуально без потерь качества (чем меньше, тем лучше качество, но больше размер)
|
||||
# preset slow = лучшее сжатие, но медленнее
|
||||
# pix_fmt yuv420p = совместимость с большинством плееров
|
||||
|
||||
echo " Сжатие с H.265 (HEVC) кодеком (CRF 18, визуально без потерь)..."
|
||||
|
||||
# Запуск ffmpeg с подавлением вывода (кроме ошибок)
|
||||
if ! ffmpeg -i "$video_file" \
|
||||
-c:v libx265 \
|
||||
-crf 18 \
|
||||
-preset slow \
|
||||
-c:a copy \
|
||||
-pix_fmt yuv420p \
|
||||
-movflags +faststart \
|
||||
-y \
|
||||
"$compressed_file" > /dev/null 2>&1; then
|
||||
|
||||
echo -e " ${RED}Ошибка при сжатии: $filename${NC}"
|
||||
rm -f "$compressed_file"
|
||||
((ERRORS++))
|
||||
continue
|
||||
fi
|
||||
|
||||
# Проверка, что сжатый файл создан
|
||||
if [ ! -f "$compressed_file" ]; then
|
||||
echo -e " ${RED}Ошибка: сжатый файл не создан${NC}"
|
||||
((ERRORS++))
|
||||
continue
|
||||
fi
|
||||
|
||||
# Размер сжатого файла
|
||||
compressed_size=$(stat -f%z "$compressed_file" 2>/dev/null || stat -c%s "$compressed_file" 2>/dev/null)
|
||||
compressed_size_mb=$(echo "scale=2; $compressed_size / 1024 / 1024" | bc)
|
||||
|
||||
# Процент сжатия
|
||||
if [ "$original_size" -gt 0 ]; then
|
||||
compression_ratio=$(echo "scale=1; (1 - $compressed_size / $original_size) * 100" | bc)
|
||||
echo " Размер сжатого: ${compressed_size_mb} MB"
|
||||
echo -e " ${GREEN}Сжатие: ${compression_ratio}%${NC}"
|
||||
fi
|
||||
|
||||
# Проверка, что сжатый файл меньше оригинала
|
||||
if [ "$compressed_size" -lt "$original_size" ]; then
|
||||
# Бэкап оригинала
|
||||
echo " Создание бэкапа оригинала..."
|
||||
cp "$video_file" "$BACKUP_DIR/$filename"
|
||||
|
||||
# Замена оригинала сжатой версией
|
||||
echo " Замена оригинала сжатой версией..."
|
||||
mv "$compressed_file" "$video_file"
|
||||
|
||||
echo -e " ${GREEN}✓ Готово: $filename${NC}"
|
||||
((PROCESSED++))
|
||||
else
|
||||
echo -e " ${YELLOW}Сжатый файл больше оригинала, оставляем оригинал${NC}"
|
||||
rm -f "$compressed_file"
|
||||
((SKIPPED++))
|
||||
fi
|
||||
|
||||
echo ""
|
||||
done
|
||||
|
||||
# Очистка временной директории
|
||||
rm -rf "$TEMP_DIR"
|
||||
|
||||
echo "=========================================="
|
||||
echo " Результаты"
|
||||
echo "=========================================="
|
||||
echo -e "${GREEN}Обработано: $PROCESSED${NC}"
|
||||
echo -e "${YELLOW}Пропущено: $SKIPPED${NC}"
|
||||
if [ "$ERRORS" -gt 0 ]; then
|
||||
echo -e "${RED}Ошибок: $ERRORS${NC}"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Финальный размер
|
||||
FINAL_SIZE=$(du -sh "$SCREENRECORDINGS_DIR" 2>/dev/null | cut -f1)
|
||||
echo -e "Финальный размер: ${GREEN}$FINAL_SIZE${NC}"
|
||||
echo ""
|
||||
|
||||
# Информация о бэкапах
|
||||
if [ -d "$BACKUP_DIR" ] && [ "$(ls -A $BACKUP_DIR 2>/dev/null)" ]; then
|
||||
BACKUP_SIZE=$(du -sh "$BACKUP_DIR" 2>/dev/null | cut -f1)
|
||||
echo -e "Бэкапы оригиналов сохранены в: ${YELLOW}$BACKUP_DIR${NC} (${BACKUP_SIZE})"
|
||||
echo ""
|
||||
echo "⚠️ После проверки сжатых видео, вы можете удалить бэкапы:"
|
||||
echo " rm -rf $BACKUP_DIR"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}Готово!${NC}"
|
||||
|
||||
135
docs/disk_cleanup/scripts/quick-cleanup-asahi.sh
Executable file
135
docs/disk_cleanup/scripts/quick-cleanup-asahi.sh
Executable file
@@ -0,0 +1,135 @@
|
||||
#!/bin/bash
|
||||
# Быстрая очистка под освобождение места для Asahi Fedora:
|
||||
# - Кэш Homebrew
|
||||
# - Docker/Colima (неиспользуемые образы и тома)
|
||||
# - Бэкапы iPhone/iPad — только старые (опционально по возрасту)
|
||||
# - Xcode DerivedData (если установлен)
|
||||
# - ~/.vscode и ~/.windsurf (~0.7 ГБ), если не нужны
|
||||
#
|
||||
# Запуск: ./quick-cleanup-asahi.sh [--yes]
|
||||
# --yes выполнить все шаги без запросов подтверждения
|
||||
|
||||
set -e
|
||||
YES="${1:-}"
|
||||
|
||||
ask() {
|
||||
local msg="$1"
|
||||
if [ "$YES" = "--yes" ]; then
|
||||
echo "$msg (--yes: пропускаем вопрос)"
|
||||
return 0
|
||||
fi
|
||||
read -p "$msg (y/n): " -n 1 -r
|
||||
echo
|
||||
[[ $REPLY =~ ^[yYдД]$ ]]
|
||||
}
|
||||
|
||||
echo "=============================================="
|
||||
echo " Быстрая очистка для Asahi (освобождение места)"
|
||||
echo "=============================================="
|
||||
echo ""
|
||||
|
||||
# --- 1. Кэш Homebrew ---
|
||||
if [ -d "$HOME/Library/Caches/Homebrew" ]; then
|
||||
size=$(du -sh "$HOME/Library/Caches/Homebrew" 2>/dev/null | cut -f1)
|
||||
echo "1. Кэш Homebrew: $size"
|
||||
if ask " Удалить кэш Homebrew?"; then
|
||||
rm -rf "$HOME/Library/Caches/Homebrew"
|
||||
echo " ✅ Кэш Homebrew удалён"
|
||||
else
|
||||
echo " Пропущено"
|
||||
fi
|
||||
else
|
||||
echo "1. Кэш Homebrew: не найден"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# --- 2. Docker / Colima ---
|
||||
if command -v docker &>/dev/null; then
|
||||
echo "2. Docker: использование места:"
|
||||
docker system df 2>/dev/null || true
|
||||
if ask " Удалить неиспользуемые образы и тома? (docker image prune -a, volume prune)"; then
|
||||
docker image prune -af 2>/dev/null || true
|
||||
docker volume prune -f 2>/dev/null || true
|
||||
echo " ✅ Docker очищен"
|
||||
else
|
||||
echo " Пропущено"
|
||||
fi
|
||||
else
|
||||
echo "2. Docker: не установлен или не в PATH"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# --- 3. Бэкапы iPhone/iPad — только старые ---
|
||||
BACKUP_ROOT="$HOME/Library/Application Support/MobileSync/Backup"
|
||||
if [ -d "$BACKUP_ROOT" ]; then
|
||||
echo "3. Бэкапы iOS (MobileSync):"
|
||||
du -sh "$BACKUP_ROOT" 2>/dev/null || true
|
||||
for dir in "$BACKUP_ROOT"/*/; do
|
||||
[ -d "$dir" ] || continue
|
||||
name=$(basename "$dir")
|
||||
size=$(du -sh "$dir" 2>/dev/null | cut -f1)
|
||||
age_days=$(( ( $(date +%s) - $(stat -f %m "$dir" 2>/dev/null || echo 0) ) / 86400 ))
|
||||
echo " $name — $size, изменён ~$age_days дн. назад"
|
||||
done
|
||||
echo " Удалять только вручную или через: Системные настройки → Основные → Хранилище → iOS."
|
||||
if ask " Удалить бэкапы старше 90 дней? (по дате изменения папки)"; then
|
||||
deleted=0
|
||||
for dir in "$BACKUP_ROOT"/*/; do
|
||||
[ -d "$dir" ] || continue
|
||||
mtime=$(stat -f %m "$dir" 2>/dev/null || echo 0)
|
||||
now=$(date +%s)
|
||||
age_days=$(( ( now - mtime ) / 86400 ))
|
||||
if [ "$age_days" -gt 90 ]; then
|
||||
echo " Удаление: $dir (старше ${age_days} дн.)"
|
||||
rm -rf "$dir" && deleted=$((deleted + 1)) || true
|
||||
fi
|
||||
done
|
||||
echo " ✅ Удалено бэкапов: $deleted"
|
||||
else
|
||||
echo " Пропущено"
|
||||
fi
|
||||
else
|
||||
echo "3. Бэкапы iOS: папка не найдена"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# --- 4. Xcode (если установлен) ---
|
||||
XCODE_DD="$HOME/Library/Developer/Xcode/DerivedData"
|
||||
if [ -d "$XCODE_DD" ]; then
|
||||
size=$(du -sh "$XCODE_DD" 2>/dev/null | cut -f1)
|
||||
echo "4. Xcode DerivedData: $size"
|
||||
if ask " Удалить DerivedData? (сборки пересоздадутся при следующем открытии проекта)"; then
|
||||
rm -rf "$XCODE_DD"
|
||||
echo " ✅ DerivedData удалён"
|
||||
else
|
||||
echo " Пропущено"
|
||||
fi
|
||||
else
|
||||
echo "4. Xcode DerivedData: не найден"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# --- 5. ~/.vscode и ~/.windsurf ---
|
||||
total_editor=0
|
||||
for d in "$HOME/.vscode" "$HOME/.windsurf"; do
|
||||
[ -d "$d" ] && total_editor=1 && break
|
||||
done
|
||||
if [ "$total_editor" -eq 1 ]; then
|
||||
echo "5. Редакторы (если пользуетесь только Cursor):"
|
||||
[ -d "$HOME/.vscode" ] && echo " ~/.vscode: $(du -sh "$HOME/.vscode" 2>/dev/null | cut -f1)"
|
||||
[ -d "$HOME/.windsurf" ] && echo " ~/.windsurf: $(du -sh "$HOME/.windsurf" 2>/dev/null | cut -f1)"
|
||||
if ask " Удалить ~/.vscode и ~/.windsurf? (расширения VS Code/Windsurf придётся поставить заново)"; then
|
||||
[ -d "$HOME/.vscode" ] && rm -rf "$HOME/.vscode" && echo " ✅ .vscode удалён"
|
||||
[ -d "$HOME/.windsurf" ] && rm -rf "$HOME/.windsurf" && echo " ✅ .windsurf удалён"
|
||||
else
|
||||
echo " Пропущено"
|
||||
fi
|
||||
else
|
||||
echo "5. .vscode / .windsurf: не найдены"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
echo "=============================================="
|
||||
echo " Готово. Свободное место:"
|
||||
df -h / | tail -1
|
||||
echo "=============================================="
|
||||
356
docs/disk_cleanup/scripts/scan-cleanup-items.sh
Executable file
356
docs/disk_cleanup/scripts/scan-cleanup-items.sh
Executable file
@@ -0,0 +1,356 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Скрипт для сканирования элементов, которые можно безопасно удалить при регулярной очистке
|
||||
# Основано на всех итерациях очистки диска
|
||||
|
||||
# Цвета для вывода
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
BLUE='\033[0;34m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
echo "=========================================="
|
||||
echo " Сканирование элементов для регулярной очистки"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
TOTAL_SIZE=0
|
||||
ITEMS_FOUND=0
|
||||
|
||||
# Функция для сканирования директории
|
||||
scan_dir() {
|
||||
local path="$1"
|
||||
local name="$2"
|
||||
local exclude_protected="$3"
|
||||
|
||||
if [ ! -d "$path" ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
# Проверка на защищенные элементы
|
||||
if [ "$exclude_protected" = "true" ]; then
|
||||
# Проверяем, не является ли это защищенным элементом
|
||||
case "$path" in
|
||||
*"/BraveSoftware"*) return ;;
|
||||
*"/Cursor/User/History"*) return ;;
|
||||
*"/Cursor/User/workspaceStorage"*) return ;;
|
||||
*"/Cursor/extensions"*) return ;;
|
||||
*"/Cursor/logs"*) return ;;
|
||||
*"/Cursor/CachedData"*) return ;;
|
||||
*"/.cursor/ai-tracking"*) return ;;
|
||||
*"/pnpm"*) return ;;
|
||||
*"/hunabapp-dev/frontend/node_modules"*) return ;;
|
||||
*"/.gradle"*) return ;;
|
||||
*"/hunabapp-dev/frontend/android/app/build"*) return ;;
|
||||
*"/Telegram Desktop"*) return ;;
|
||||
*"/anytype"*) return ;;
|
||||
*"/direct-commander"*) return ;;
|
||||
*"/backup_"*) return ;;
|
||||
*"/archives_"*) return ;;
|
||||
*"/methatron/pics/tablecloth/1-7.zip"*) return ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
local size=$(du -sm "$path" 2>/dev/null | cut -f1)
|
||||
if [ -n "$size" ] && [ "$size" -gt 0 ]; then
|
||||
local size_mb=$size
|
||||
local size_gb=$(echo "scale=2; $size / 1024" | bc 2>/dev/null || echo "0")
|
||||
printf " %-60s %8sMB (%sGB)\n" "$name" "$size_mb" "$size_gb"
|
||||
TOTAL_SIZE=$((TOTAL_SIZE + size))
|
||||
((ITEMS_FOUND++))
|
||||
fi
|
||||
}
|
||||
|
||||
# Функция для сканирования файлов по паттерну
|
||||
scan_files() {
|
||||
local pattern="$1"
|
||||
local name="$2"
|
||||
local exclude_protected="$3"
|
||||
|
||||
local total=0
|
||||
while IFS= read -r file; do
|
||||
if [ -n "$file" ] && [ -f "$file" ]; then
|
||||
# Проверка на защищенные элементы
|
||||
if [ "$exclude_protected" = "true" ]; then
|
||||
case "$file" in
|
||||
*"/backup_"*) continue ;;
|
||||
*"/archives_"*) continue ;;
|
||||
*"/methatron/pics/tablecloth/1-7.zip"*) continue ;;
|
||||
*"/legal/legal_education/books/Martin/.../Дополнительный урок по маркам.rar"*) continue ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
local size=$(du -sm "$file" 2>/dev/null | cut -f1)
|
||||
if [ -n "$size" ] && [ "$size" -gt 0 ]; then
|
||||
total=$((total + size))
|
||||
fi
|
||||
fi
|
||||
done < <(find ~/code -type f $pattern 2>/dev/null | head -20)
|
||||
|
||||
if [ "$total" -gt 0 ]; then
|
||||
local size_gb=$(echo "scale=2; $total / 1024" | bc 2>/dev/null || echo "0")
|
||||
printf " %-60s %8sMB (%sGB)\n" "$name" "$total" "$size_gb"
|
||||
TOTAL_SIZE=$((TOTAL_SIZE + total))
|
||||
((ITEMS_FOUND++))
|
||||
fi
|
||||
}
|
||||
|
||||
echo -e "${CYAN}=== КРИТИЧЕСКИЙ ПРИОРИТЕТ (кэши разработки) ===${NC}"
|
||||
echo ""
|
||||
|
||||
# npm кэш
|
||||
scan_dir "$HOME/.npm" "npm кэш" true
|
||||
scan_dir "$HOME/.npm/_npx" "npm npx кэш" true
|
||||
|
||||
# node-gyp кэш
|
||||
scan_dir "$HOME/Library/Caches/node-gyp" "node-gyp кэш" true
|
||||
|
||||
# TypeScript кэш
|
||||
scan_dir "$HOME/Library/Caches/typescript" "TypeScript кэш" true
|
||||
|
||||
# pip кэш
|
||||
scan_dir "$HOME/Library/Caches/pip" "pip кэш" true
|
||||
|
||||
# .yarn кэш
|
||||
scan_dir "$HOME/.yarn" ".yarn кэш" true
|
||||
|
||||
# Colima кэш
|
||||
scan_dir "$HOME/.colima" "Colima кэш" true
|
||||
scan_dir "$HOME/Library/Caches/colima" "Colima кэш (Library)" true
|
||||
|
||||
# Codeium/Windsurf кэши
|
||||
scan_dir "$HOME/.codeium/windsurf" "Codeium/Windsurf кэш" true
|
||||
|
||||
echo ""
|
||||
echo -e "${CYAN}=== node_modules (исключая защищенные) ===${NC}"
|
||||
echo ""
|
||||
|
||||
# node_modules (исключая защищенные)
|
||||
find ~/code -type d -name "node_modules" \
|
||||
-not -path "*/venv/*" \
|
||||
-not -path "*/.venv/*" \
|
||||
-not -path "*/env/*" \
|
||||
-not -path "*/hunabapp-dev/frontend/node_modules" \
|
||||
-exec du -sh {} \; 2>/dev/null | sort -hr | head -5 | while read size path; do
|
||||
printf " %-60s %8s\n" "$path" "$size"
|
||||
local size_mb=$(du -sm "$path" 2>/dev/null | cut -f1)
|
||||
if [ -n "$size_mb" ]; then
|
||||
TOTAL_SIZE=$((TOTAL_SIZE + size_mb))
|
||||
((ITEMS_FOUND++))
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo -e "${CYAN}=== BUILD АРТЕФАКТЫ (исключая защищенные) ===${NC}"
|
||||
echo ""
|
||||
|
||||
# Build артефакты (исключая защищенные)
|
||||
find ~/code -type d \( -name "build" -o -name "dist" -o -name ".next" -o -name "out" \) \
|
||||
-not -path "*/node_modules/*" \
|
||||
-not -path "*/venv/*" \
|
||||
-not -path "*/.venv/*" \
|
||||
-not -path "*/env/*" \
|
||||
-not -path "*/site-packages/*" \
|
||||
-not -path "*/hunabapp-dev/frontend/android/app/build*" \
|
||||
-exec du -sh {} \; 2>/dev/null | sort -hr | head -10 | while read size path; do
|
||||
printf " %-60s %8s\n" "$path" "$size"
|
||||
local size_mb=$(du -sm "$path" 2>/dev/null | cut -f1)
|
||||
if [ -n "$size_mb" ]; then
|
||||
TOTAL_SIZE=$((TOTAL_SIZE + size_mb))
|
||||
((ITEMS_FOUND++))
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo -e "${CYAN}=== КЭШИ БРАУЗЕРОВ (кроме защищенных) ===${NC}"
|
||||
echo ""
|
||||
|
||||
# Google Chrome кэш
|
||||
scan_dir "$HOME/Library/Caches/Google" "Google Chrome кэш" true
|
||||
|
||||
# Firefox кэш
|
||||
scan_dir "$HOME/Library/Caches/Firefox" "Firefox кэш" true
|
||||
|
||||
# com.brave.Browser кэш (отдельный, не основной)
|
||||
scan_dir "$HOME/Library/Caches/com.brave.Browser" "Brave Browser кэш (отдельный)" true
|
||||
|
||||
echo ""
|
||||
echo -e "${CYAN}=== КЭШИ ПРИЛОЖЕНИЙ ===${NC}"
|
||||
echo ""
|
||||
|
||||
# Notion
|
||||
scan_dir "$HOME/Library/Application Support/Notion" "Notion кэш" true
|
||||
|
||||
# zoom.us
|
||||
scan_dir "$HOME/Library/Application Support/zoom.us" "zoom.us кэш" true
|
||||
|
||||
# LibreOffice
|
||||
scan_dir "$HOME/Library/Application Support/LibreOffice" "LibreOffice кэш" true
|
||||
|
||||
# Movavi
|
||||
scan_dir "$HOME/Library/Application Support/Movavi" "Movavi кэш" true
|
||||
|
||||
# Ledger Live
|
||||
scan_dir "$HOME/Library/Application Support/Ledger Live" "Ledger Live кэш" true
|
||||
|
||||
# Syncthing
|
||||
scan_dir "$HOME/Library/Application Support/Syncthing" "Syncthing кэш" true
|
||||
|
||||
# ResponsivelyApp
|
||||
scan_dir "$HOME/Library/Application Support/ResponsivelyApp" "ResponsivelyApp кэш" true
|
||||
|
||||
echo ""
|
||||
echo -e "${CYAN}=== CURSOR КЭШИ (кроме защищенных) ===${NC}"
|
||||
echo ""
|
||||
|
||||
# Cursor WebStorage
|
||||
scan_dir "$HOME/Library/Application Support/Cursor/WebStorage" "Cursor WebStorage" true
|
||||
|
||||
# Cursor Partitions
|
||||
scan_dir "$HOME/Library/Application Support/Cursor/Partitions" "Cursor Partitions" true
|
||||
|
||||
# Cursor projects
|
||||
scan_dir "$HOME/.cursor/projects" "Cursor projects" true
|
||||
|
||||
# Cursor CachedExtensionVSIXs
|
||||
scan_dir "$HOME/Library/Application Support/Cursor/CachedExtensionVSIXs" "Cursor CachedExtensionVSIXs" true
|
||||
|
||||
# Cursor logs (старые, если есть)
|
||||
if [ -d "$HOME/Library/Application Support/Cursor/logs" ]; then
|
||||
local logs_size=$(du -sm "$HOME/Library/Application Support/Cursor/logs" 2>/dev/null | cut -f1)
|
||||
if [ -n "$logs_size" ] && [ "$logs_size" -gt 10 ]; then
|
||||
printf " %-60s %8sMB\n" "Cursor logs (старые)" "$logs_size"
|
||||
TOTAL_SIZE=$((TOTAL_SIZE + logs_size))
|
||||
((ITEMS_FOUND++))
|
||||
fi
|
||||
fi
|
||||
|
||||
# ShipIt кэш
|
||||
scan_dir "$HOME/Library/Caches/com.todesktop.230313mzl4w4u92.ShipIt" "Cursor ShipIt кэш" true
|
||||
|
||||
echo ""
|
||||
echo -e "${CYAN}=== СИСТЕМНЫЕ КЭШИ ===${NC}"
|
||||
echo ""
|
||||
|
||||
# Homebrew кэш
|
||||
scan_dir "$HOME/Library/Caches/Homebrew" "Homebrew кэш" true
|
||||
|
||||
# GeoServices кэш
|
||||
scan_dir "$HOME/Library/Caches/GeoServices" "GeoServices кэш" true
|
||||
|
||||
# Apple системные кэши
|
||||
scan_dir "$HOME/Library/Caches/com.apple.helpd" "com.apple.helpd" true
|
||||
scan_dir "$HOME/Library/Caches/com.apple.parsecd" "com.apple.parsecd" true
|
||||
scan_dir "$HOME/Library/Caches/com.apple.appstoreagent" "com.apple.appstoreagent" true
|
||||
scan_dir "$HOME/Library/Caches/com.apple.CloudTelemetry" "com.apple.CloudTelemetry" true
|
||||
scan_dir "$HOME/Library/Caches/com.apple.AMPLibraryAgent" "com.apple.AMPLibraryAgent" true
|
||||
scan_dir "$HOME/Library/Caches/com.apple.AppleMediaServices" "com.apple.AppleMediaServices" true
|
||||
scan_dir "$HOME/Library/Caches/com.apple.ctcategories.service" "com.apple.ctcategories.service" true
|
||||
scan_dir "$HOME/Library/Caches/com.apple.amsengagementd" "com.apple.amsengagementd" true
|
||||
scan_dir "$HOME/Library/Caches/com.apple.tipsd" "com.apple.tipsd" true
|
||||
scan_dir "$HOME/Library/Caches/com.apple.itunescloudd" "com.apple.itunescloudd" true
|
||||
scan_dir "$HOME/Library/Caches/com.apple.nbagent" "com.apple.nbagent" true
|
||||
scan_dir "$HOME/Library/Caches/askpermissiond" "askpermissiond" true
|
||||
scan_dir "$HOME/Library/Caches/com.apple.python" "com.apple.python" true
|
||||
scan_dir "$HOME/Library/Caches/audioCache.kcache" "audioCache.kcache" true
|
||||
scan_dir "$HOME/Library/Caches/Mega" "Mega кэш" true
|
||||
scan_dir "$HOME/Library/Caches/kdenlive" "kdenlive кэш" true
|
||||
|
||||
echo ""
|
||||
echo -e "${CYAN}=== ЛОГИ ===${NC}"
|
||||
echo ""
|
||||
|
||||
# Логи Google
|
||||
scan_dir "$HOME/Library/Logs/Google" "Логи Google" true
|
||||
|
||||
# Пустые логи
|
||||
local empty_logs=$(find ~/Library/Logs -type f -size 0 2>/dev/null | wc -l | tr -d ' ')
|
||||
if [ "$empty_logs" -gt 0 ]; then
|
||||
printf " %-60s %8s файлов\n" "Пустые логи" "$empty_logs"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${CYAN}=== PYTHON КЭШИ ===${NC}"
|
||||
echo ""
|
||||
|
||||
# __pycache__ в venv
|
||||
find ~/code -type d -name "__pycache__" \
|
||||
-path "*/venv/*" -o -path "*/.venv/*" -o -path "*/env/*" \
|
||||
-exec du -sh {} \; 2>/dev/null | sort -hr | head -10 | while read size path; do
|
||||
printf " %-60s %8s\n" "$path" "$size"
|
||||
local size_mb=$(du -sm "$path" 2>/dev/null | cut -f1)
|
||||
if [ -n "$size_mb" ]; then
|
||||
TOTAL_SIZE=$((TOTAL_SIZE + size_mb))
|
||||
((ITEMS_FOUND++))
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo -e "${CYAN}=== ЗАПИСИ ЭКРАНА ===${NC}"
|
||||
echo ""
|
||||
|
||||
# ScreenRecordings
|
||||
scan_dir "$HOME/Library/ScreenRecordings" "ScreenRecordings" true
|
||||
|
||||
echo ""
|
||||
echo -e "${CYAN}=== СТАРЫЕ АРХИВЫ (опционально) ===${NC}"
|
||||
echo ""
|
||||
|
||||
# Старые архивы (исключая защищенные)
|
||||
find ~/code -type f \( -name "*.zip" -o -name "*.rar" -o -name "*.tar.gz" -o -name "*.7z" \) \
|
||||
-not -path "*/backup_*" \
|
||||
-not -path "*/archives_*" \
|
||||
-not -path "*/methatron/pics/tablecloth/1-7.zip" \
|
||||
-size +10M \
|
||||
-exec du -sh {} \; 2>/dev/null | sort -hr | head -10 | while read size path; do
|
||||
printf " %-60s %8s\n" "$path" "$size"
|
||||
local size_mb=$(du -sm "$path" 2>/dev/null | cut -f1)
|
||||
if [ -n "$size_mb" ]; then
|
||||
TOTAL_SIZE=$((TOTAL_SIZE + size_mb))
|
||||
((ITEMS_FOUND++))
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo -e "${CYAN}=== GIT РЕПОЗИТОРИИ (для оптимизации, не удаление) ===${NC}"
|
||||
echo ""
|
||||
|
||||
# Git репозитории для оптимизации
|
||||
find ~/code -type d -name ".git" -exec sh -c '
|
||||
repo=$(dirname "$1")
|
||||
git_size=$(du -sm "$repo/.git" 2>/dev/null | cut -f1)
|
||||
if [ -n "$git_size" ] && [ "$git_size" -gt 100 ]; then
|
||||
printf " %-60s %8sMB\n" "$repo" "$git_size"
|
||||
fi
|
||||
' _ {} \; 2>/dev/null | sort -k2 -nr | head -5
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo -e " ${GREEN}ИТОГИ СКАНИРОВАНИЯ${NC}"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo -e "Найдено элементов для очистки: ${YELLOW}$ITEMS_FOUND${NC}"
|
||||
echo ""
|
||||
|
||||
if [ "$TOTAL_SIZE" -gt 0 ]; then
|
||||
local total_gb=$(echo "scale=2; $TOTAL_SIZE / 1024" | bc 2>/dev/null || echo "0")
|
||||
echo -e "Общий размер: ${GREEN}${TOTAL_SIZE}MB (~${total_gb}GB)${NC}"
|
||||
else
|
||||
echo -e "Общий размер: ${GREEN}0MB${NC}"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${YELLOW}⚠️ ВАЖНО:${NC}"
|
||||
echo " - Защищённые элементы (см. DISK_CLEANUP.md) исключены из сканирования"
|
||||
echo " - Проверьте список перед удалением"
|
||||
echo " - Некоторые элементы могут быть пересозданы автоматически"
|
||||
echo ""
|
||||
echo -e "${BLUE}💡 РЕКОМЕНДАЦИИ:${NC}"
|
||||
echo " - Для регулярной очистки используйте: REGULAR_CLEANUP.md"
|
||||
echo " - Главный документ: DISK_CLEANUP.md"
|
||||
echo ""
|
||||
|
||||
|
||||
|
||||
48
docs/disk_cleanup/scripts/scan-move-candidates.sh
Normal file
48
docs/disk_cleanup/scripts/scan-move-candidates.sh
Normal file
@@ -0,0 +1,48 @@
|
||||
#!/bin/bash
|
||||
# Сканирование кандидатов на перенос на внешний носитель (цель — освободить ~100 ГБ).
|
||||
# Показывает крупные каталоги и опционально — не менявшиеся давно (редко используемые).
|
||||
|
||||
OUTPUT_MODE="${1:-size}" # size | old | both
|
||||
DAYS_OLD="${2:-90}" # для old: не менявшиеся N дней
|
||||
|
||||
echo "=========================================="
|
||||
echo " Кандидаты на перенос (освобождение ~100 ГБ)"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
echo "=== Крупные каталоги в ~/code (топ по размеру) ==="
|
||||
du -sh ~/code/* 2>/dev/null | sort -hr | head -20
|
||||
echo ""
|
||||
|
||||
echo "=== Известные тяжёлые каталоги пользователя ==="
|
||||
for path in \
|
||||
"$HOME/code/legal" \
|
||||
"$HOME/g.drive mikhevel" \
|
||||
"$HOME/Library/Application Support/Telegram Desktop" \
|
||||
"$HOME/code/methatron" \
|
||||
"$HOME/code/repo-clean-secrets-workdir-20260303-192601" \
|
||||
"$HOME/code/archive" \
|
||||
"$HOME/code/backups" \
|
||||
"$HOME/code/bots" \
|
||||
"$HOME/code/sacred_songs" \
|
||||
"$HOME/.gradle" \
|
||||
"$HOME/Library/Android/sdk" \
|
||||
"$HOME/.cursor" \
|
||||
"$HOME/.vscode"; do
|
||||
if [ -d "$path" ]; then
|
||||
du -sh "$path" 2>/dev/null
|
||||
fi
|
||||
done
|
||||
echo ""
|
||||
|
||||
if [ "$OUTPUT_MODE" = "old" ] || [ "$OUTPUT_MODE" = "both" ]; then
|
||||
echo "=== Крупные каталоги в ~/code, не менявшиеся ${DAYS_OLD}+ дней (редко используемые) ==="
|
||||
find ~/code -maxdepth 2 -type d -mtime +"$DAYS_OLD" -exec du -sh {} \; 2>/dev/null | sort -hr | head -15
|
||||
echo ""
|
||||
fi
|
||||
|
||||
echo "=== Свободное место на корневом разделе ==="
|
||||
df -h / | tail -1
|
||||
echo ""
|
||||
echo "Цель: не менее 60 ГБ для Asahi Fedora, рекомендуется 80–100 ГБ."
|
||||
echo "Подробности: docs/disk_cleanup/MOVE_TO_EXTERNAL_100GB.md"
|
||||
Reference in New Issue
Block a user