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 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 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 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 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 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 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
rmnão tem modo seco. O substituto é o mesmo padrão comls:ls -1 src/logs/*.logmostra exatamente o que orm src/logs/*.loglevaria.echo rm …também serve, imprimindo o comando pronto em vez de executá-lo. -nsignifica coisas diferentes em comandos diferentes. No rsync é modo seco, nogrep -nsão números de linha, nosort -né ordem numérica. Não transporte o hábito às cegas: no find a checagem é-printe 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
-nda 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
- Apagar arquivos com mais de N dias
- Copiar arquivos preservando a estrutura de pastas
- Localizar e substituir em vários arquivos
O CliAI marca um comando destrutivo como CAUTION ou DANGER e oferece antes a forma em modo seco. Instale em uma linha.