CLI AI

Primero en seco: rsync, find, git clean y sed

2026-08-04

rsync -avn, find … -print y git clean -nd imprimen exactamente lo que haría la versión destructiva, y de ella los separa un solo flag. El hábito es siempre el mismo: ejecutar en modo "enséñamelo", leer la lista y quitar el flag. La excepción es rm: no tiene ese modo, y el rodeo importa.

1. rsync: -n muestra qué se copiaría

clai
$ clai muestra qué copiaría rsync sin copiarlo→ 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)

Las dos últimas palabras, (DRY RUN), son la única diferencia en la salida. La lista de archivos es idéntica a la del envío real: quita el -n y se copian exactamente esos.

2. rsync --delete: la combinación que muerde

clai
$ clai muestra qué borraría rsync en el destino→ rsync -avn --delete src/ backup/sending incremental file listdeleting old-report.csvdeleting obsolete.py./notes.txtutil.pylogs/old.log

Las líneas deleting son el motivo entero para molestarse con -n. Sin él, esos dos archivos desaparecen en silencio — verificado: la misma orden sin -n imprimió las mismas dos líneas y los eliminó.

3. find: primero -print, después -delete

clai
$ clai muestra los logs de más de 30 días sin borrarlos→ find src -name '*.log' -mtime +30 -printsrc/logs/old.log

find evalúa sus condiciones de izquierda a derecha, así que -print al final muestra precisamente la lista que recibiría -delete. Nunca los intercambies: -delete -name '*.log' borra primero todo el árbol y filtra después.

4. git clean: -n imprime lo que eliminaría

clai
$ clai muestra qué archivos sin seguimiento eliminaría git clean→ git clean -ndWould remove backup/Would remove src/notes.txtWould remove tmpdir/

-n es la comprobación y -d incluye directorios. Lanzar git clean -fd sin la pasada previa con -nd es la forma más rápida de perder un archivo que olvidaste añadir al índice.

5. sed: la vista previa es sed sin -i

clai
$ clai muestra cómo quedaría el reemplazo en conf.ini sin cambiar el archivo→ sed 's/old/new/' conf.inihost=newport=80

Sin -i, sed imprime el resultado en el terminal y no toca el archivo: ese es su modo en seco de fábrica. Verificado: cat conf.ini después sigue mostrando host=old.

6. Cuando la edición sí entra, guarda una copia

clai
$ clai reemplaza en conf.ini pero guarda una copia de seguridad→ sed -i.bak 's/old/new/' conf.ini

Al lado aparece conf.ini.bak con el contenido original. En macOS el sufijo es obligatorio aunque esté vacío (-i ''), el detalle que rompe los scripts traídos de Linux.

Gotchas

  • rm no tiene modo en seco. El sustituto es el mismo patrón con ls: ls -1 src/logs/*.log muestra exactamente lo que se llevaría rm src/logs/*.log. También sirve echo rm …, que imprime el comando completo en vez de ejecutarlo.
  • -n significa cosas distintas según el comando. En rsync es modo en seco, en grep -n números de línea, en sort -n orden numérico. No traslades la costumbre a ciegas: en find la comprobación es -print y en git es --dry-run.
  • La comprobación y la ejecución deben diferir en un solo flag. Si además cambiaste la ruta, el patrón o el orden de los argumentos, comprobaste otro comando. Borra el -n de la línea que ya escribiste en lugar de teclearla de nuevo.

Related questions

¿Los gestores de paquetes tienen modo en seco? Sí: apt-get -s install paquete muestra el plan sin instalar, dnf tiene --assumeno y docker docker system prune --dry-run.

¿Cómo compruebo qué hará un script? bash -n script.sh revisa la sintaxis sin ejecutar nada; bash -x script.sh imprime cada comando mientras corre — ojo, los ejecuta.

¿Se puede deshacer rsync --delete? No. Las protecciones son -n de antemano o --backup --backup-dir=…, que aparta los archivos condenados en vez de borrarlos.

See also

CliAI marca un comando destructivo como CAUTION o DANGER y ofrece antes su forma en seco. Instálalo en una línea.