Initial commit: local_machine docs and scripts

This commit is contained in:
ahauimix
2026-03-14 20:03:57 +03:00
commit a39ef89125
85 changed files with 14500 additions and 0 deletions

View 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}"

View 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 "=============================================="

View 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 ""

View 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, рекомендуется 80100 ГБ."
echo "Подробности: docs/disk_cleanup/MOVE_TO_EXTERNAL_100GB.md"