CLI AI

«Сожми эту директорию и залей в S3» — пайплайн из одной строки

2026-02-07

Половина одноразовых бэкапов выглядит одинаково: взять папку, сжать, отправить с этого хоста. Никто не любит выписывать пайп руками. Имя с датой, уровень gzip, правильные флаги S3 — поверхности достаточно, чтобы притормозить.

Полный пайп одним промптом

clai
$ clai сжми эту папку tar+gzip с датой и залей в s3://team-backups/db/→ tar -czf - . \    | aws s3 cp - "s3://team-backups/db/$(basename "$PWD")-$(date +%Y%m%d-%H%M).tar.gz"upload: <stdin> to s3://team-backups/db/data-20260427-1432.tar.gz

Пара заметок. Архив стримится: tar -czf - пишет в stdout, aws s3 cp - читает stdin — промежуточный файл на диск не падает. Ключ S3 содержит и имя директории, и timestamp — обычно именно это и нужно для бэкап-нейминга.

Добавим «удалить при успехе»

Естественное продолжение: убрать источник, если заливка прошла.

clai
$ clai сделай ту же заливку и удали локальную папку, если код возврата 0→ tar -czf - . \    | aws s3 cp - "s3://team-backups/db/$(basename "$PWD")-$(date +%Y%m%d-%H%M).tar.gz" \    && rm -rf -- "$PWD"[Safety: DANGER] — рекурсивное удаление рабочей директории.

CliAI пометил второй вариант DANGER из-за хвостового rm -rf -- "$PWD". Классификатор смотрит на весь пайплайн, не только на первую стадию. Как принимается это решение — в посте про safety.

Когда правильный ответ — не S3

Меняйте назначение — «в gs://my-bucket», «на удалённый хост через rsync», «в Backblaze B2» — структура остаётся той же. Пайпу всё равно, какой URL; модель выбирает нужный загрузчик.

См. также