# Scripts literais

Todos validados numa área de trabalho real de 240 itens / 107 GB (Tata, 11/07/2026). Ajustar `ALVO` e `SP`.

```zsh
ALVO="$HOME/Desktop"                 # ou ~/Downloads, ou o que a pessoa pedir
SP="<sua pasta de scratchpad>"       # arquivos temporários da análise
mkdir -p "$SP/frames"
```

---

## § 1 — RECONHECER (inventário)

```zsh
cd "$ALVO"

echo "=== TOTAL ==="
ls -1 | wc -l ; du -sh "$ALVO"

echo "=== ARQUIVOS SOLTOS POR EXTENSÃO ==="
ls -1p | grep -v / | sed 's/.*\.//' | sort | uniq -c | sort -rn

echo "=== PASTAS QUE JÁ EXISTEM ==="
for d in "$ALVO"/*/; do
  printf "%-40s %5s itens  %8s\n" "$(basename "$d")" \
    "$(ls -1 "$d" | wc -l | tr -d ' ')" "$(du -sh "$d" | cut -f1)"
done

echo "=== QUANTOS TÊM NOME INÚTIL (= o tamanho real do trabalho) ==="
ls -1p | grep -v / | grep -icE '^(Captura|Screenshot|CleanShot|Gravação|Simulator|IMG_|WhatsApp|download|[0-9a-f]{16,})'

echo "=== FFMPEG? ==="
which ffmpeg ffprobe || echo "SEM FFMPEG — vídeos vão sem frame (instalar: brew install ffmpeg)"
```

> ⚠️ **Não rode `du -sh` dentro de um loop grande junto com `md5`** — em disco cheio de vídeo isso estoura o timeout. Faça em comandos separados.

---

## § 2 — ENXERGAR (frames + lotes)

### 2a. Frame + duração de cada vídeo

```zsh
cd "$ALVO"
i=0
for f in *.mov *.MOV *.mp4 *.webm *.m4v(N); do
  [ -e "$f" ] || continue
  i=$((i+1))
  dur=$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$f" 2>/dev/null | cut -d. -f1)
  sz=$(du -h "$f" | cut -f1 | tr -d ' ')
  seek=$(( ${dur:-10} / 4 ))                       # frame a 25% da duração
  ffmpeg -v error -ss "$seek" -i "$f" -vframes 1 -vf "scale=640:-1" \
         "$SP/frames/$(printf '%02d' $i).jpg" -y 2>/dev/null
  printf "%02d|%s|%ss|%s\n" "$i" "$f" "${dur:-?}" "$sz"
done | tee "$SP/videos.txt"

echo "frames gerados: $(ls -1 "$SP/frames" | wc -l)  (de $i vídeos)"
```

**Se gerou menos frames que vídeos**, algum vídeo é só áudio. Confirmar:

```zsh
ffprobe -v error -show_entries stream=codec_type,codec_name -of csv=p=0 "arquivo.webm"
# → "opus,audio"  = só áudio, sem vídeo. Classificar por nome. Normalmente é gravação de reunião.
```

### 2b. Quebrar em lotes pros subagentes

```zsh
cd "$ALVO"
ls -1p | grep -v /$ | grep -iE '\.(png|jpg|jpeg|heic|webp)$' \
  | while read -r f; do echo "$ALVO/$f"; done > "$SP/imgs.txt"
split -l 14 "$SP/imgs.txt" "$SP/batch_img_"

ls -1 "$SP"/frames/*.jpg > "$SP/frames.txt"
split -l 13 "$SP/frames.txt" "$SP/batch_frm_"

wc -l "$SP"/batch_*
```

Agora dispare **todos** os subagentes numa mensagem só, com os prompts de `prompts.md`.

---

## § 3 — ARRUMAR (mover com rede de segurança)

Escreva o `plano.tsv` (`destino<TAB>nome do arquivo`, um por linha) e rode `assets/mover.zsh`:

```zsh
zsh <caminho da skill>/assets/mover.zsh "$ALVO" "$SP/plano.tsv"
```

Ele devolve:

```
════════ RESULTADO ════════
Movidos: 238 | Falhas: 0

Sobrou na raiz:
atalho de Painel da Tatá
```

E escreve dois arquivos em `$ALVO/.organizacao/`:
- `manifesto.tsv` — o destino de cada arquivo
- `DESFAZER.zsh` — devolve tudo pra raiz, linha a linha

**Falha > 0 significa typo.** Corrija o `plano.tsv` e rode de novo — o script é idempotente (o que já moveu, ficou).

---

## § 4 — Fechamento

```zsh
# a raiz tem que caber numa tela
ls -1 "$ALVO"

# conferência: manifesto x movidos
wc -l < "$ALVO/.organizacao/manifesto.tsv"

# peso por subpasta (pra achar o peso morto e citar no guia)
cd "$ALVO"
for d in [0-9]*/*/; do
  printf "%-58s %3s  %8s\n" "${d%/}" \
    "$(ls -1 "$d" 2>/dev/null | wc -l | tr -d ' ')" "$(du -sh "$d" 2>/dev/null | cut -f1)"
done
```

Copiar `assets/guia-template.html` pra `$ALVO/📖 GUIA DA ÁREA DE TRABALHO.html`, preenchendo com os números e os achados **citados pelo nome**.
