CLI AI

Сначала вхолостую: rsync, find, git clean и sed

2026-08-04

rsync -avn, find … -print и git clean -nd печатают ровно то, что сделала бы разрушительная версия, и от неё их отделяет один флаг. Привычка всегда одна и та же: запустить в режиме «покажи», прочитать список, убрать флаг. Исключение — rm: у него такого режима нет, и обходной приём здесь важен.

1. rsync: -n показывает, что будет скопировано

clai
$ clai покажи, что скопирует rsync, но не копируй→ 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)

Последние два слова, (DRY RUN), — единственное отличие вывода. Список файлов совпадает с настоящим запуском: уберёте -n — скопируются ровно они.

2. rsync --delete: сочетание, которое кусается

clai
$ clai покажи, что rsync удалит в приёмнике→ rsync -avn --delete src/ backup/sending incremental file listdeleting old-report.csvdeleting obsolete.py./notes.txtutil.pylogs/old.log

Строки deleting — то, ради чего вообще стоит возиться с -n. Без него эти два файла исчезают молча. Проверено: тот же запуск без -n напечатал те же две строки и удалил файлы.

3. find: сначала -print, потом -delete

clai
$ clai покажи логи старше 30 дней, но не удаляй их→ find src -name '*.log' -mtime +30 -printsrc/logs/old.log

find проверяет условия слева направо, поэтому -print в конце показывает ровно тот список, который достанется -delete. Менять их местами нельзя: -delete -name '*.log' сначала удалит всё дерево, а фильтровать будет потом.

4. git clean: -n печатает, что удалит

clai
$ clai покажи, какие неотслеживаемые файлы удалит git clean→ git clean -ndWould remove backup/Would remove src/notes.txtWould remove tmpdir/

-n — это проверка, -d добавляет каталоги. Запустить git clean -fd, не сделав сначала -nd, — самый быстрый способ потерять файл, который вы забыли добавить в индекс.

5. sed: предпросмотр — это sed без -i

clai
$ clai покажи, как будет выглядеть замена в conf.ini, не меняя файл→ sed 's/old/new/' conf.inihost=newport=80

Без -i sed печатает результат в терминал и файл не трогает — это и есть его встроенный холостой режим. Проверено: cat conf.ini после этого по-прежнему показывает host=old.

6. Если правка всё-таки идёт в файл — оставьте копию

clai
$ clai замени в conf.ini, но сохрани резервную копию→ sed -i.bak 's/old/new/' conf.ini

Рядом появится conf.ini.bak с исходным содержимым. На macOS суффикс обязателен даже пустой (-i '') — деталь, на которой ломаются скрипты, переехавшие с Linux.

Gotchas

  • У rm холостого режима нет. Замена — тот же шаблон, но с ls: ls -1 src/logs/*.log покажет ровно то, что заберёт rm src/logs/*.log. Годится и echo rm … — он печатает готовую команду вместо запуска.
  • -n у разных команд значит разное. У rsync это холостой прогон, у grep -n — номера строк, у sort -n — числовая сортировка. Не переносите привычку вслепую: у find проверка называется -print, у git — --dry-run.
  • Проверка и запуск должны отличаться ровно одним флагом. Если между ними вы поменяли ещё и путь, шаблон или порядок аргументов, то проверяли другую команду. Убирайте -n из уже набранной строки, а не набирайте её заново.

Related questions

Есть ли холостой режим у пакетных менеджеров? Есть: apt-get -s install пакет показывает план без установки, у dnf это --assumeno, у docker — docker system prune --dry-run.

Как проверить, что сделает скрипт? bash -n script.sh проверит синтаксис, ничего не выполняя; bash -x script.sh печатает каждую команду перед выполнением — но выполняет, имейте в виду.

Можно ли отменить rsync --delete? Нет. Защита только одна: -n заранее либо --backup --backup-dir=…, который откладывает обречённые файлы в отдельный каталог вместо удаления.

See also

CliAI помечает разрушительную команду меткой CAUTION или DANGER и сначала предлагает её холостой вариант. Поставить одной строкой.