В 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:?} в скриптах ловят остальное. Но единственная настоящая страховка — рабочий бэкап, который вы проверяли.