CLI AI

Primeiro em modo seco: rsync, find, git clean e sed

2026-08-04

rsync -avn, find … -print e git clean -nd imprimem exatamente o que a versão destrutiva faria, e delas os separa uma única flag. O hábito é sempre o mesmo: rodar no modo "me mostre", ler a lista e tirar a flag. A exceção é o rm: ele não tem esse modo, e o contorno importa.

1. rsync: -n mostra o que seria copiado

clai
$ clai mostre o que o rsync copiaria sem copiar→ rsync -avn src/ backup/sending incremental file listapp.pyutil.pylogs/logs/app.logsent 159 bytes  received 29 bytes  376.00 bytes/sectotal size is 8  speedup is 0.04 (DRY RUN)

As duas últimas palavras, (DRY RUN), são a única diferença na saída. A lista de arquivos é idêntica à do envio real — tire o -n e são exatamente esses que vão.

2. rsync --delete: a combinação que morde

clai
$ clai mostre o que o rsync apagaria no destino→ rsync -avn --delete src/ backup/sending incremental file listdeleting old-report.csvdeleting obsolete.py./notes.txtutil.pylogs/old.log

As linhas deleting são o motivo inteiro de se dar ao trabalho do -n. Sem ele, esses dois arquivos somem calados — verificado: a mesma execução sem -n imprimiu as mesmas duas linhas e apagou os arquivos.

3. find: primeiro -print, depois -delete

clai
$ clai mostre os logs com mais de 30 dias sem apagar→ find src -name '*.log' -mtime +30 -printsrc/logs/old.log

O find avalia os testes da esquerda para a direita, então o -print no fim mostra precisamente a lista que o -delete receberia. Nunca inverta: -delete -name '*.log' apaga a árvore toda antes de filtrar.

4. git clean: -n imprime o que removeria

clai
$ clai mostre quais arquivos não rastreados o git clean removeria→ git clean -ndWould remove backup/Would remove src/notes.txtWould remove tmpdir/

-n é a checagem e -d inclui diretórios. Rodar git clean -fd sem a passada com -nd antes é o jeito mais rápido de perder um arquivo que você esqueceu de adicionar ao índice.

5. sed: a prévia é o sed sem -i

clai
$ clai mostre como ficaria a substituição no conf.ini sem alterar o arquivo→ sed 's/old/new/' conf.inihost=newport=80

Sem -i, o sed imprime o resultado no terminal e não encosta no arquivo — esse é o modo seco embutido dele. Verificado: cat conf.ini depois continua mostrando host=old.

6. Quando a edição vai mesmo, guarde uma cópia

clai
$ clai substitua no conf.ini mas guarde um backup→ sed -i.bak 's/old/new/' conf.ini

Ao lado aparece conf.ini.bak com o conteúdo original. No macOS o sufixo é obrigatório mesmo vazio (-i '') — o detalhe que quebra scripts trazidos do Linux.

Gotchas

  • O rm não tem modo seco. O substituto é o mesmo padrão com ls: ls -1 src/logs/*.log mostra exatamente o que o rm src/logs/*.log levaria. echo rm … também serve, imprimindo o comando pronto em vez de executá-lo.
  • -n significa coisas diferentes em comandos diferentes. No rsync é modo seco, no grep -n são números de linha, no sort -n é ordem numérica. Não transporte o hábito às cegas: no find a checagem é -print e no git é --dry-run.
  • A checagem e a execução devem diferir por exatamente uma flag. Se no meio você também mudou o caminho, o padrão ou a ordem dos argumentos, checou outro comando. Apague o -n da linha que já está escrita em vez de digitá-la de novo.

Related questions

Gerenciadores de pacote têm modo seco? Têm: apt-get -s install pacote mostra o plano sem instalar, o dnf tem --assumeno e o docker tem docker system prune --dry-run.

Como vejo o que um script vai fazer? bash -n script.sh confere a sintaxe sem executar nada; bash -x script.sh imprime cada comando enquanto roda — mas repare que ele roda.

Dá para desfazer um rsync --delete? Não. As proteções são o -n antes ou o --backup --backup-dir=…, que move os arquivos condenados para outro lugar em vez de apagá-los.

See also

O CliAI marca um comando destrutivo como CAUTION ou DANGER e oferece antes a forma em modo seco. Instale em uma linha.