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,135 @@
# 🔧 Исправление проблемы с workspace'ами в Anytype после очистки кэша
## 📋 Проблема
После выполнения очистки кэша workspace'ы в Anytype не загружаются.
## 🔍 Причина
При очистке была удалена вся папка `~/Library/Application Support/anytype`, которая содержит:
-**Кэши** (можно безопасно удалить)
-**Важные данные workspace'ов** (нельзя удалять):
- `localstore` — локальное хранилище данных workspace'ов
- `spaceStoreNew` — хранилище пространств
- `objectstore` — база данных объектов
- `config.json` — конфигурация аккаунта
- `device.key` — ключ устройства
## ✅ Решение
### Вариант 1: Восстановление из облака (рекомендуется)
1. **Закройте Anytype полностью:**
```bash
killall Anytype 2>/dev/null
```
2. **Проверьте наличие папки localstore:**
```bash
ls -la ~/Library/Application\ Support/anytype/data/*/localstore
```
3. **Если папка отсутствует, перезапустите Anytype:**
- Приложение должно автоматически создать новую папку `localstore`
- Workspace'ы должны синхронизироваться из облака
4. **Если проблема сохраняется, переименуйте папку spaceStoreNew:**
```bash
cd ~/Library/Application\ Support/anytype/data/A8uFR2vXWQ3A4H1WBfMGSwAFJ4qefprENcfqrqrfZ2NM9qxB/
mv spaceStoreNew spaceStoreNew_backup
```
5. **Перезапустите Anytype** — приложение создаст новую папку и восстановит данные из облака
### Вариант 2: Восстановление базы данных (если есть проблемы с spacestore)
Если проблема связана с повреждением базы данных `spacestore`:
1. **Скачайте Badger для macOS:**
- GitHub: https://github.com/anyproto/badger/releases
- Выберите версию для macOS (darwin)
2. **Создайте резервную копию:**
```bash
cd ~/Library/Application\ Support/anytype/data/A8uFR2vXWQ3A4H1WBfMGSwAFJ4qefprENcfqrqrfZ2NM9qxB/
cp -r spaceStoreNew spaceStoreNew_backup_$(date +%Y%m%d)
```
3. **Запустите Badger для восстановления:**
```bash
./badger --dir ~/Library/Application\ Support/anytype/data/A8uFR2vXWQ3A4H1WBfMGSwAFJ4qefprENcfqrqrfZ2NM9qxB/spaceStoreNew fix
```
### Вариант 3: Полный сброс (если данные не критичны)
⚠️ **ВНИМАНИЕ:** Это удалит все локальные данные. Workspace'ы должны восстановиться из облака.
1. **Закройте Anytype:**
```bash
killall Anytype 2>/dev/null
```
2. **Создайте резервную копию:**
```bash
mv ~/Library/Application\ Support/anytype ~/Library/Application\ Support/anytype_backup_$(date +%Y%m%d)
```
3. **Перезапустите Anytype** — приложение создаст новую папку и восстановит данные из облака
## 🛡️ Предотвращение проблемы в будущем
### Безопасная очистка кэша Anytype
Вместо удаления всей папки `~/Library/Application Support/anytype`, удаляйте только кэши:
```bash
# Безопасная очистка кэшей Anytype
rm -rf ~/Library/Application\ Support/anytype/Cache
rm -rf ~/Library/Application\ Support/anytype/Code\ Cache
rm -rf ~/Library/Application\ Support/anytype/GPUCache
rm -rf ~/Library/Application\ Support/anytype/DawnGraphiteCache
rm -rf ~/Library/Application\ Support/anytype/DawnWebGPUCache
rm -rf ~/Library/Application\ Support/anytype/data/cache
rm -rf ~/Library/Caches/anytype-updater
rm -rf ~/Library/Caches/com.anytype.anytype
```
### ⚠️ НЕ УДАЛЯЙТЕ:
- `~/Library/Application Support/anytype/data/` — содержит данные workspace'ов
- `~/Library/Application Support/anytype/data/*/localstore` — локальное хранилище
- `~/Library/Application Support/anytype/data/*/spaceStoreNew` — хранилище пространств
- `~/Library/Application Support/anytype/data/*/objectstore` — база данных объектов
- `~/Library/Application Support/anytype/data/*/config.json` — конфигурация
- `~/Library/Application Support/anytype/data/*/device.key` — ключ устройства
## 📊 Структура данных Anytype
```
~/Library/Application Support/anytype/
├── Cache/ ✅ Можно удалить (кэш)
├── Code Cache/ ✅ Можно удалить (кэш)
├── GPUCache/ ✅ Можно удалить (кэш)
├── DawnGraphiteCache/ ✅ Можно удалить (кэш)
├── DawnWebGPUCache/ ✅ Можно удалить (кэш)
├── data/ ❌ НЕ УДАЛЯТЬ
│ ├── cache/ ✅ Можно удалить (кэш)
│ └── <accountId>/ ❌ НЕ УДАЛЯТЬ
│ ├── localstore/ ❌ КРИТИЧНО - данные workspace'ов
│ ├── spaceStoreNew/ ❌ КРИТИЧНО - хранилище пространств
│ ├── objectstore/ ❌ КРИТИЧНО - база данных объектов
│ ├── config.json ❌ КРИТИЧНО - конфигурация
│ ├── device.key ❌ КРИТИЧНО - ключ устройства
│ ├── auth/ ❌ КРИТИЧНО - данные авторизации
│ └── flatfs/ ⚠️ Можно удалить (файловое хранилище, но лучше не трогать)
└── logs/ ✅ Можно удалить (логи)
```
## 🔗 Дополнительные ресурсы
- [Документация Anytype - Устранение неполадок](https://doc.anytype.io/anytype-docs/russian/raznoe/troubleshooting)
- [Badger для восстановления базы данных](https://github.com/anyproto/badger/releases)
## 📝 История изменений
- **2025-12-16** — Создан документ с описанием проблемы и решений

View File

@@ -0,0 +1,55 @@
# Changelog — docs/disk_cleanup
Все значимые изменения документации и правил очистки диска.
---
## 2025-03-14
### Консолидация
- **Один главный документ:** [DISK_CLEANUP.md](./DISK_CLEANUP.md) объединяет DO_NOT_DELETE, SAFE_TO_DELETE_NOW, DISK_CLEANUP_STANDARD, REGULAR_CLEANUP, DISK_SCAN_CURRENT.
- **Сокращение файлов:** удалены дублирующие документы (списки перенесены в DISK_CLEANUP.md).
- **Добавлен CHANGELOG.md** (этот файл).
### Содержимое DISK_CLEANUP.md
- Таблица «Что НЕ удалять» (полный список).
- Таблицы «Что безопасно удалять» по категориям: кэши разработки, Library/Caches, приложения, Cursor, прочее, build, node_modules.
- Раздел «Кто отжирает диск» (типичные потребители места).
- Быстрые команды для освобождения ~1012 GB.
- Регулярность очистки (еженедельно / ежемесячно / при нехватке места).
- Ссылка на ANYTYPE_WORKSPACE_FIX и описание скриптов.
### Сохранённые файлы
- **DISK_CLEANUP.md** — главный документ.
- **CHANGELOG.md** — история изменений.
- **cleanup-disk-now.sh** — скрипт очистки (без DO_NOT_DELETE пунктов).
- **ANYTYPE_WORKSPACE_FIX.md** — восстановление anytype после ошибочной очистки.
- **scripts/** — scan-cleanup-items.sh, compress-screenrecordings.sh, quick-cleanup-asahi.sh, scan-move-candidates.sh.
- **find-external-disks.sh**, **diagnose-external-disk.sh** — утилиты для внешних дисков.
### Удалённые / объединённые документы
- DO_NOT_DELETE.md → раздел в DISK_CLEANUP.md
- SAFE_TO_DELETE_NOW.md → раздел в DISK_CLEANUP.md
- DISK_CLEANUP_STANDARD.md → раздел в DISK_CLEANUP.md
- REGULAR_CLEANUP.md → раздел «Регулярность» в DISK_CLEANUP.md
- DISK_SCAN_CURRENT.md → раздел «Кто отжирает диск» в DISK_CLEANUP.md
- AGREED_90GB_PLAN.md, MOVE_TO_EXTERNAL_100GB.md, SCAN_REPORT.md, disk-cleanup-guide.md — содержание учтено или устарело; при необходимости смотреть в git history.
---
## 2025-03-14 (ранее в сессии)
- В **cleanup-disk-now.sh** убрано удаление объектов из DO_NOT_DELETE (Brave, Cursor History/workspaceStorage, Telegram, pnpm, anytype). Скрипт приведён в соответствие с безопасным списком.
- В список безопасного удаления добавлены: **state.vscdb.backup** (~10 GB), Library/Caches (ShipIt, anytype-updater, com.brave.Browser, Firefox, Google, Homebrew).
- Windsurf: полное удаление из системы (.codeium/windsurf, .windsurf, Application Support/Windsurf).
---
## 2025-01-29
- Создан стандарт очистки (DISK_CLEANUP_STANDARD), DO_NOT_DELETE, REGULAR_CLEANUP.
- Определены защищённые элементы и безопасные кэши для регулярной очистки.

View File

@@ -0,0 +1,189 @@
# 🧹 Очистка диска Mac — сводный гайд
Один документ: что не трогать, что можно удалять, быстрые команды, скрипты.
**Скрипт:** [cleanup-disk-now.sh](./cleanup-disk-now.sh) · **Спец. фикс:** [ANYTYPE_WORKSPACE_FIX.md](./ANYTYPE_WORKSPACE_FIX.md) · **История:** [CHANGELOG.md](./CHANGELOG.md)
---
## Содержание
1. [❌ Что НЕ удалять](#-что-не-удалять)
2. [✅ Что безопасно удалять](#-что-безопасно-удалять)
3. [📊 Кто отжирает диск](#-кто-отжирает-диск)
4. [🚀 Быстрые команды](#-быстрые-команды)
5. [🔄 Регулярность очистки](#-регулярность-очистки)
6. [🔧 Anytype: не удалять папку целиком](#-anytype-не-удалять-папку-целиком)
7. [📁 Скрипты](#-скрипты)
8. [📋 Changelog](#-changelog)
---
## ❌ Что НЕ удалять
| Категория | Пути | Причина |
|-----------|------|---------|
| Brave | `~/Library/Application Support/BraveSoftware`, `~/Library/Caches/BraveSoftware` | Настройки, закладки, история |
| Cursor History | `~/Library/Application Support/Cursor/User/History` | История изменений файлов |
| Cursor workspaceStorage | `~/Library/Application Support/Cursor/User/workspaceStorage` | Настройки workspace |
| Cursor extensions | `~/.cursor/extensions` | Кэш расширений, переустановка при удалении |
| Cursor logs / CachedData / ai-tracking | `.../Cursor/logs`, `.../Cursor/CachedData`, `~/.cursor/ai-tracking` | Производительность |
| direct-commander | `~/Library/Application Support/direct-commander` | Настройки файлового менеджера |
| anytype | Вся папка `~/Library/Application Support/anytype` | Данные workspace'ов (localstore, spaceStoreNew и др.) |
| Android SDK | `~/Library/Android/sdk` | Разработка Android |
| Бэкапы в bots | `~/code/bots/backup_*`, `~/code/bots/archives_*` | Восстановление проектов |
| Telegram Desktop | `~/Library/Application Support/Telegram Desktop` | Данные и кэш Telegram |
| Старые архивы | `~/code/methatron/pics/tablecloth/1-7.zip`, архивы в legal | Могут понадобиться |
| pnpm | `~/Library/pnpm`, `~/Library/Caches/pnpm` | Повторная загрузка 967+ пакетов |
| node_modules (frontend) | `~/code/hunabapp-dev/frontend/node_modules` | То же |
| .gradle | `~/.gradle` | Кэш сборки Android/Java |
| Android build | `~/code/hunabapp-dev/frontend/android/app/build` | Артефакты сборки |
**Итого сохраняется:** ~910 GB (ориентир).
---
## ✅ Что безопасно удалять
Всё ниже — кэши или пересобираемое; не трогать пункты из таблицы выше.
### Кэши разработки
| Что | Путь | Ориентир |
|-----|------|----------|
| Colima | `~/.colima`, `~/Library/Caches/colima` | до ~30 GB |
| npm | `~/.npm`, `~/.npm/_npx` | 300500 MB |
| node-gyp | `~/Library/Caches/node-gyp` | — |
| TypeScript | `~/Library/Caches/typescript` | — |
| pip | `~/Library/Caches/pip` | — |
| .yarn | `~/.yarn` | — |
| Windsurf полностью | `~/.codeium/windsurf`, `~/.windsurf`, `~/Library/Application Support/Windsurf` | — |
### Library/Caches (без Brave)
| Что | Путь | Ориентир |
|-----|------|----------|
| ShipIt (Cursor) | `~/Library/Caches/com.todesktop.230313mzl4w4u92.ShipIt` | 768 MB |
| anytype-updater | `~/Library/Caches/anytype-updater` | 453 MB |
| com.brave.Browser | `~/Library/Caches/com.brave.Browser` | 423 MB |
| Firefox | `~/Library/Caches/Firefox` | 83 MB |
| Google | `~/Library/Caches/Google` | — |
| Homebrew | `~/Library/Caches/Homebrew` | — |
### Кэши приложений (не Telegram)
Notion, zoom.us, LibreOffice, Movavi, Ledger Live, Syncthing (если не нужен):
`~/Library/Application Support/{Notion,zoom.us,LibreOffice,Movavi,Ledger Live,Syncthing}`
### Cursor — только эти кэши и файлы
| Что | Путь | Ориентир |
|-----|------|----------|
| **state.vscdb.backup** | `.../Cursor/User/globalStorage/state.vscdb.backup` | **~10 GB** |
| ShipIt | см. выше в Library/Caches | 768 MB |
| WebStorage | `.../Cursor/WebStorage` | — |
| Partitions | `.../Cursor/Partitions` | — |
| projects | `~/.cursor/projects` | — |
**Опционально (~13 GB):** удаление `state.vscdb` + `-wal` + `-shm` в том же каталоге сбрасывает глобальное состояние редактора. **Закрыть Cursor перед удалением.**
### Прочее
- `~/.cache`
- Пустые логи: `find ~/Library/Logs -type f -size 0 -delete`
- Записи экрана: `~/Library/ScreenRecordings/*` (проверить вручную)
### Build-артефакты в ~/code
Исключить: `*/hunabapp-dev/frontend/android/*`, `*/node_modules/*`, `*/venv/*`, `*/site-packages/*`.
```bash
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 "*/site-packages/*" -not -path "*/hunabapp-dev/frontend/android/*" \
-exec rm -rf {} + 2>/dev/null
```
### node_modules (опционально)
Исключить: `~/code/hunabapp-dev/frontend/node_modules`. После удаления — `pnpm install` в нужных проектах.
---
## 📊 Кто отжирает диск
Типичные крупные потребители (ориентир):
| Путь | Размер | Действие |
|------|--------|----------|
| Cursor User/globalStorage (state.vscdb + .backup) | ~23 GB | .backup — удалить; state.vscdb — опционально |
| ~/code/legal, hunabapp-dev, archive, backups | 116 GB | Вручную |
| Telegram, anytype | 12 GB | Не удалять |
| Library/Caches (ShipIt, anytype-updater, браузеры) | ~2 GB | Удалять по списку выше |
| .gradle, .cursor/extensions | ~1.5 GB | Не удалять |
Запуск сканирования: `./scripts/scan-cleanup-items.sh`.
---
## 🚀 Быстрые команды
**С закрытым Cursor** (освободит ~1012 GB):
```bash
# Cursor state backup
rm -f "$HOME/Library/Application Support/Cursor/User/globalStorage/state.vscdb.backup"
# Library/Caches (не Brave)
rm -rf "$HOME/Library/Caches/com.todesktop.230313mzl4w4u92.ShipIt"
rm -rf "$HOME/Library/Caches/anytype-updater"
rm -rf "$HOME/Library/Caches/com.brave.Browser"
rm -rf "$HOME/Library/Caches/Firefox"
rm -rf "$HOME/Library/Caches/Google"
rm -rf "$HOME/Library/Caches/Homebrew"
# Cursor кэши
rm -rf "$HOME/Library/Application Support/Cursor/WebStorage"
rm -rf "$HOME/.cursor/projects"
# Прочее
rm -rf "$HOME/.cache"
find "$HOME/Library/Logs" -type f -size 0 -delete 2>/dev/null
```
Полная безопасная очистка по категориям — в [cleanup-disk-now.sh](./cleanup-disk-now.sh).
---
## 🔄 Регулярность очистки
- **Еженедельно:** build-артефакты, пустые логи.
- **Ежемесячно:** кэши разработки (npm, node-gyp, TypeScript, pip, .yarn), Library/Caches (Google, Firefox, ShipIt, anytype-updater), Cursor WebStorage/Partitions/projects.
- **При заполнении диска >80%:** всё из ежемесячного + Colima (если не нужен), state.vscdb.backup, приложения (Notion, zoom, LibreOffice, Movavi, Ledger), записи экрана.
---
## 🔧 Anytype: не удалять папку целиком
В `~/Library/Application Support/anytype` лежат и кэши, и **данные workspace'ов** (localstore, spaceStoreNew, objectstore и др.). Удаление всей папки ломает загрузку workspace'ов. Подробное восстановление: [ANYTYPE_WORKSPACE_FIX.md](./ANYTYPE_WORKSPACE_FIX.md).
---
## 📁 Скрипты
| Файл | Назначение |
|------|------------|
| [cleanup-disk-now.sh](./cleanup-disk-now.sh) | Интерактивная безопасная очистка (согласовано с DO_NOT_DELETE) |
| [scripts/scan-cleanup-items.sh](./scripts/scan-cleanup-items.sh) | Сканирование: что можно удалить и размеры |
| [scripts/compress-screenrecordings.sh](./scripts/compress-screenrecordings.sh) | Сжатие записей экрана |
| [scripts/quick-cleanup-asahi.sh](./scripts/quick-cleanup-asahi.sh) | Быстрая очистка под Asahi |
| [scripts/scan-move-candidates.sh](./scripts/scan-move-candidates.sh) | Кандидаты на перенос на внешний диск |
| [find-external-disks.sh](./find-external-disks.sh) | Поиск внешних дисков |
| [diagnose-external-disk.sh](./diagnose-external-disk.sh) | Диагностика внешнего диска |
---
## 📋 Changelog
См. [CHANGELOG.md](./CHANGELOG.md).
**Последнее обновление:** 2025-03-14 — консолидация документации, один главный файл DISK_CLEANUP.md, сокращение числа файлов.

View File

@@ -0,0 +1,167 @@
#!/bin/bash
# Безопасная очистка диска — по списку из docs/disk_cleanup/DISK_CLEANUP.md.
# НЕ трогает: Brave, Cursor History/workspaceStorage/extensions, Telegram, pnpm, anytype.
set -e
echo "🧹 Безопасная очистка диска (согласовано с DO_NOT_DELETE)"
echo "=========================================================="
echo ""
cleanup_dir() {
local dir="$1"
local name="$2"
if [ -d "$dir" ] || [ -f "$dir" ]; then
size=$(du -sh "$dir" 2>/dev/null | cut -f1)
echo "🗑️ Удаление $name ($size)..."
rm -rf "$dir" 2>/dev/null && echo "$name очищен" || echo " ⚠️ Не удалось удалить $name"
else
echo " $name не найден, пропускаем"
fi
}
echo "📊 Текущее состояние диска:"
df -h / | tail -1
echo ""
# 1. Кэши разработки: Colima, npm, node-gyp, TypeScript, pip, .yarn
echo "=== 1. Кэши разработки ==="
cleanup_dir "$HOME/.colima" "Colima кэш"
cleanup_dir "$HOME/Library/Caches/colima" "Colima кэш (Library)"
cleanup_dir "$HOME/.npm" "npm кэш"
cleanup_dir "$HOME/Library/Caches/node-gyp" "node-gyp кэш"
cleanup_dir "$HOME/Library/Caches/typescript" "TypeScript кэш"
cleanup_dir "$HOME/Library/Caches/pip" "pip кэш"
cleanup_dir "$HOME/.yarn" ".yarn кэш"
echo ""
# 2. Windsurf полностью (кэш + данные; приложение — удалить вручную из Программы)
echo "=== 2. Windsurf полностью ==="
cleanup_dir "$HOME/.codeium/windsurf" "Codeium/Windsurf кэш"
cleanup_dir "$HOME/.windsurf" "Windsurf данные"
cleanup_dir "$HOME/Library/Application Support/Windsurf" "Windsurf Application Support"
# Если .codeium пуст — можно удалить целиком
[ -d "$HOME/.codeium" ] && [ -z "$(ls -A "$HOME/.codeium" 2>/dev/null)" ] && rm -rf "$HOME/.codeium" && echo " ✅ .codeium (пустая) удалена"
echo ""
# 3. Кэши браузеров — только Google/Firefox (Brave в DO_NOT_DELETE)
echo "=== 3. Кэши браузеров (не Brave) ==="
cleanup_dir "$HOME/Library/Caches/Google" "Google кэш"
cleanup_dir "$HOME/Library/Caches/Firefox" "Firefox кэш"
cleanup_dir "$HOME/Library/Caches/com.brave.Browser" "com.brave.Browser кэш"
echo ""
# 4. Приложения — Notion, zoom, LibreOffice, Movavi, Ledger (Telegram в DO_NOT_DELETE)
echo "=== 4. Кэши приложений ==="
cleanup_dir "$HOME/Library/Application Support/Notion" "Notion"
cleanup_dir "$HOME/Library/Application Support/zoom.us" "zoom.us"
cleanup_dir "$HOME/Library/Application Support/LibreOffice" "LibreOffice"
cleanup_dir "$HOME/Library/Application Support/Movavi" "Movavi"
cleanup_dir "$HOME/Library/Application Support/Ledger Live" "Ledger Live"
echo ""
# 5. Cursor — только разрешённые кэши и state backup (~10 GB)
echo "=== 5. Cursor кэши (только разрешённые) ==="
STATE_BACKUP="$HOME/Library/Application Support/Cursor/User/globalStorage/state.vscdb.backup"
if [ -f "$STATE_BACKUP" ]; then
size=$(du -sh "$STATE_BACKUP" 2>/dev/null | cut -f1)
echo " state.vscdb.backup ($size) — закрыть Cursor перед удалением!"
read -p " Удалить state.vscdb.backup? (y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
rm -f "$STATE_BACKUP" && echo " ✅ state.vscdb.backup удалён" || echo " ⚠️ Закрой Cursor и повтори"
else
echo " ⏭️ Пропущено"
fi
fi
cleanup_dir "$HOME/Library/Caches/com.todesktop.230313mzl4w4u92.ShipIt" "Cursor ShipIt"
cleanup_dir "$HOME/Library/Application Support/Cursor/WebStorage" "Cursor WebStorage"
cleanup_dir "$HOME/Library/Application Support/Cursor/Partitions" "Cursor Partitions"
cleanup_dir "$HOME/.cursor/projects" "Cursor projects"
echo ""
# 6. Homebrew, .cache, пустые логи
echo "=== 6. Homebrew, .cache, пустые логи ==="
cleanup_dir "$HOME/Library/Caches/Homebrew" "Homebrew кэш"
cleanup_dir "$HOME/.cache" ".cache"
find "$HOME/Library/Logs" -type f -size 0 -delete 2>/dev/null && echo " ✅ Пустые логи удалены" || true
echo ""
# 7. ScreenRecordings (по желанию)
echo "=== 7. Записи экрана ==="
if [ -d "$HOME/Library/ScreenRecordings" ]; then
count=$(find "$HOME/Library/ScreenRecordings" -type f 2>/dev/null | wc -l | tr -d ' ')
if [ "$count" -gt 0 ]; then
echo " Найдено файлов: $count"
read -p " Удалить все записи экрана? (y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
cleanup_dir "$HOME/Library/ScreenRecordings" "Записи экрана"
else
echo " ⏭️ Пропущено"
fi
else
echo " Папка пуста"
fi
fi
echo ""
# 8. Build артефакты (исключая hunabapp-dev/frontend/android — в DO_NOT_DELETE)
echo "=== 8. Build артефакты в ~/code (кроме android) ==="
read -p " Удалить build/dist/.next/out? (y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
find "$HOME/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 "*/site-packages/*" \
-not -path "*/env/*" \
-not -path "*/hunabapp-dev/frontend/android/*" \
-exec rm -rf {} + 2>/dev/null || true
echo " ✅ Готово"
else
echo " ⏭️ Пропущено"
fi
echo ""
# 9. node_modules (опционально; НЕ frontend — в DO_NOT_DELETE)
echo "=== 9. node_modules (кроме hunabapp-dev/frontend) ==="
read -p " Удалить node_modules в проектах? (y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
find "$HOME/code" -type d -name "node_modules" \
-not -path "*/venv/*" \
-not -path "*/.venv/*" \
-not -path "*/hunabapp-dev/frontend/node_modules" \
-exec rm -rf {} + 2>/dev/null || true
echo " ✅ Готово. В нужных проектах: pnpm install"
else
echo " ⏭️ Пропущено"
fi
echo ""
# 10. UTM виртуальная машина — опционально
echo "=== 10. UTM виртуальная машина ==="
if [ -d "$HOME/code/Parrot-home-mate-6.4_arm64.utm" ]; then
read -p " Удалить UTM виртуальную машину? (y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
cleanup_dir "$HOME/code/Parrot-home-mate-6.4_arm64.utm" "UTM виртуальная машина"
else
echo " ⏭️ Пропущено"
fi
else
echo " Не найдена"
fi
echo ""
echo "=========================================================="
echo "📊 Состояние диска после очистки:"
df -h / | tail -1
echo ""
echo "✅ Очистка завершена. Перезапустите приложения при необходимости."
echo " Список: docs/disk_cleanup/DISK_CLEANUP.md"
echo ""

View File

@@ -0,0 +1,85 @@
#!/bin/bash
# Диагностика проблемы с внешним диском на macOS
# Использование: ./diagnose-external-disk.sh
echo "=========================================="
echo "Диагностика внешнего диска на macOS"
echo "=========================================="
echo ""
# 1. Проверка подключенных дисков
echo "1. Список всех дисков:"
echo "----------------------------------------"
diskutil list
echo ""
# 2. Проверка USB устройств
echo "2. USB устройства:"
echo "----------------------------------------"
system_profiler SPUSBDataType | grep -A 10 -i "mass\|storage\|disk" || echo "Нет USB устройств хранения данных"
echo ""
# 3. Проверка не смонтированных дисков
echo "3. Информация о всех дисках:"
echo "----------------------------------------"
diskutil info -all 2>&1 | grep -E "Device Node|Volume Name|Removable Media|Disk Size" | head -40
echo ""
# 4. Проверка системных логов на ошибки
echo "4. Последние ошибки дисков в логах:"
echo "----------------------------------------"
log show --predicate 'subsystem == "com.apple.diskmanagementd" OR subsystem == "com.apple.diskarbitrationd"' --last 10m --style syslog 2>/dev/null | tail -20 || echo "Нет ошибок в логах"
echo ""
# 5. Проверка низкоуровневых USB устройств
echo "5. USB устройства на низком уровне:"
echo "----------------------------------------"
ioreg -p IOUSB -l -w 0 | grep -B 5 -A 15 -i "mass\|storage" | head -50 || echo "Нет USB устройств хранения"
echo ""
# 6. Проверка доступных портов
echo "6. Доступные USB порты:"
echo "----------------------------------------"
system_profiler SPUSBDataType | grep -E "USB|Port|Hub" | head -30
echo ""
# 7. Проверка файловой системы
echo "7. Проверка файловых систем:"
echo "----------------------------------------"
diskutil listFilesystems
echo ""
echo "=========================================="
echo "РЕКОМЕНДАЦИИ:"
echo "=========================================="
echo ""
echo "1. Проверьте физическое подключение:"
echo " - Отключите и снова подключите диск"
echo " - Попробуйте другой USB порт"
echo " - Попробуйте другой USB кабель"
echo ""
echo "2. Проверьте питание диска:"
echo " - Убедитесь что диск получает достаточно питания"
echo " - Если диск требует внешнего питания, подключите его"
echo ""
echo "3. Попробуйте другой компьютер:"
echo " - Проверьте работает ли диск на другом Mac/PC"
echo ""
echo "4. Проверьте формат диска:"
echo " - macOS может не видеть диски с некоторыми файловыми системами"
echo " - Попробуйте открыть Дисковую утилиту (Disk Utility)"
echo ""
echo "5. Попробуйте принудительно смонтировать:"
echo " diskutil mountDisk /dev/diskX # где X - номер диска"
echo ""
echo "6. Проверьте настройки безопасности:"
echo " - Системные настройки > Безопасность > Разрешить подключение внешних устройств"
echo ""

View File

@@ -0,0 +1,81 @@
#!/bin/bash
# Поиск внешних дисков - расширенная версия
echo "=========================================="
echo "ПОИСК ВНЕШНИХ ДИСКОВ"
echo "=========================================="
echo ""
echo "1. Все диски в системе:"
echo "----------------------------------------"
diskutil list
echo ""
echo "2. Все устройства в /dev/disk*:"
echo "----------------------------------------"
ls -lh /dev/disk* 2>/dev/null | head -30
echo ""
echo "3. Информация о каждом диске (ищем внешние):"
echo "----------------------------------------"
for disk in /dev/disk[0-9] /dev/disk[1-9][0-9]; do
if [ -b "$disk" ] 2>/dev/null; then
info=$(diskutil info "$disk" 2>/dev/null)
if echo "$info" | grep -qi "removable.*yes\|external\|protocol.*usb\|protocol.*thunderbolt"; then
echo ">>> НАЙДЕН ВОЗМОЖНО ВНЕШНИЙ ДИСК: $disk"
echo "$info" | grep -E "Device Node|Volume Name|Disk Size|Removable Media|Protocol|Connection|File System" | head -10
echo ""
fi
fi
done
echo "4. USB устройства:"
echo "----------------------------------------"
system_profiler SPUSBDataType 2>/dev/null | grep -A 15 -i "mass\|storage\|disk\|volume" || echo "Нет USB устройств хранения"
echo ""
echo "5. Thunderbolt устройства:"
echo "----------------------------------------"
system_profiler SPThunderboltDataType 2>/dev/null | grep -A 15 -i "disk\|storage\|volume" || echo "Нет Thunderbolt устройств хранения"
echo ""
echo "6. Смонтированные тома:"
echo "----------------------------------------"
mount | grep -E "/dev/disk|/Volumes" | grep -v "/System/Volumes"
echo ""
echo "7. Содержимое /Volumes:"
echo "----------------------------------------"
ls -la /Volumes/
echo ""
echo "8. Попытка принудительного пересканирования:"
echo "----------------------------------------"
sudo diskutil list 2>&1 | head -5
echo ""
echo "9. Проверка через ioreg (IOBlockStorageDevice):"
echo "----------------------------------------"
ioreg -p IOService -r -n IOBlockStorageDevice -w 0 2>/dev/null | grep -A 10 -i "removable\|external" | head -40 || echo "Нет внешних устройств в ioreg"
echo ""
echo "=========================================="
echo "РЕКОМЕНДАЦИИ:"
echo "=========================================="
echo ""
echo "Если диски не найдены:"
echo "1. Проверьте физическое подключение"
echo "2. Попробуйте другой USB/Thunderbolt порт"
echo "3. Попробуйте другой кабель"
echo "4. Проверьте питание дисков"
echo "5. Откройте Дисковую утилиту: open -a 'Disk Utility'"
echo "6. Попробуйте перезагрузить Mac"
echo ""

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"