rsync -avn, find … -print и git clean -nd печатают ровно то, что сделала бы разрушительная версия, и от неё их отделяет один флаг. Привычка всегда одна и та же: запустить в режиме «покажи», прочитать список, убрать флаг. Исключение — rm: у него такого режима нет, и обходной приём здесь важен.
1. rsync: -n показывает, что будет скопировано
$ 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 покажи, что 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 покажи логи старше 30 дней, но не удаляй их→ find src -name '*.log' -mtime +30 -printsrc/logs/old.log
find проверяет условия слева направо, поэтому -print в конце показывает ровно тот список, который достанется -delete. Менять их местами нельзя: -delete -name '*.log' сначала удалит всё дерево, а фильтровать будет потом.
4. git clean: -n печатает, что удалит
$ 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 покажи, как будет выглядеть замена в conf.ini, не меняя файл→ sed 's/old/new/' conf.inihost=newport=80
Без -i sed печатает результат в терминал и файл не трогает — это и есть его встроенный холостой режим. Проверено: cat conf.ini после этого по-прежнему показывает host=old.
6. Если правка всё-таки идёт в файл — оставьте копию
$ 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
- Удалить файлы старше N дней
- Скопировать файлы, сохранив структуру папок
- Найти и заменить во всех файлах
CliAI помечает разрушительную команду меткой CAUTION или DANGER и сначала предлагает её холостой вариант. Поставить одной строкой.