Linux Lifehack

Как не удалить лишнего: страховка от rm -rf

Одна опечатка в пути превращает удаление каталога в удаление системы. Несколько приёмов, которые ловят ошибку до её выполнения.

Проверено: Ubuntu 24.04, Debian 12
Как не удалить лишнего: страховка от rm -rf

В Linux нет корзины и нет подтверждения. Команда rm -rf выполняется молча и необратимо — восстановление возможно только из бэкапа.

Предупреждение. Классическая ошибка — лишний пробел: rm -rf /opt /app вместо rm -rf /opt/app. Первая команда удалит весь /opt и несуществующий /app. Вторая — только нужный каталог.

Приём 1: сначала посмотреть

Перед удалением по маске замените rm на ls и убедитесь, что попадает именно то, что нужно:

ls -la /var/log/app/*.log
# убедились — только потом
rm /var/log/app/*.log

Для рекурсивного удаления тот же приём через find с -print:

find /opt/app -name "*.tmp" -print
find /opt/app -name "*.tmp" -delete

Приём 2: алиас с подтверждением

В ~/.bashrc:

alias rm='rm -I --preserve-root'
alias cp='cp -i'
alias mv='mv -i'

Ключ -I (заглавная i) спросит подтверждение при удалении больше трёх файлов или при рекурсии — но не будет надоедать на одиночных файлах, в отличие от -i.

--preserve-root запрещает rm -rf /. В современных дистрибутивах это поведение по умолчанию, но явное указание не помешает.

Предупреждение. Алиасы не работают в скриптах и при запуске через sudo. Не полагайтесь на них как на единственную защиту.

Приём 3: абсолютные пути и переменные

В скриптах опасна конструкция с переменной, которая может оказаться пустой:

rm -rf "$DIR/"     # если DIR пустая — удалит /

Правильно — с проверкой:

set -euo pipefail
[[ -n "${DIR:-}" ]] || { echo "DIR не задана"; exit 1; }
[[ -d "$DIR" ]]     || { echo "Каталог не найден: $DIR"; exit 1; }
rm -rf "${DIR:?}"

Конструкция ${DIR:?} прервёт выполнение с ошибкой, если переменная пуста или не установлена.

Приём 4: корзина вместо удаления

Утилита trash-cli перемещает файлы в корзину XDG вместо удаления:

sudo apt install -y trash-cli
trash-put /path/to/file
trash-list
trash-restore

На рабочей станции это разумно. На сервере — скорее нет: корзина займёт место и создаст иллюзию, что файл удалён.

Приём 5: защита от записи

Для критичных каталогов на ext4 можно поставить атрибут неизменяемости:

sudo chattr +i /etc/важный-конфиг

Теперь файл не удалить и не изменить даже от root, пока атрибут не снят:

sudo chattr -i /etc/важный-конфиг

Итог

Главная привычка — посмотреть перед удалением через ls или find -print. Алиасы и ${VAR:?} в скриптах ловят остальное. Но единственная настоящая страховка — рабочий бэкап, который вы проверяли.