rm
Удалить файлы и директории (без корзины)
Описание
rm (от remove) — команда удаления файлов и директорий. Это одна из наиболее
опасных команд в Unix/Linux: удалённые файлы не попадают в корзину и, как правило, не подлежат
восстановлению стандартными средствами. Команда удаляет ссылку на файл в каталоге (unlink) —
данные освобождаются, когда счётчик ссылок падает до нуля и ни один процесс не держит файл открытым.
По умолчанию rm удаляет только файлы, но не директории. Для удаления директорий
необходим флаг -r (рекурсивно). Сочетание rm -rf — самое мощное и
самое опасное: оно рекурсивно удаляет всё без вопросов, игнорируя права доступа на запись.
Понимание rm критически важно: ошибочный rm -rf с неверным путём
может уничтожить систему или важные данные за секунды. Поэтому хорошей практикой является
использование -i в интерактивной работе и тщательная проверка путей перед удалением.
Для «мягкого» удаления существуют утилиты типа trash-cli, которые перемещают файлы
в корзину вместо немедленного удаления.
Синтаксис
- ФАЙЛ — один или несколько файлов для удаления
- -r ДИРЕКТОРИЯ — рекурсивное удаление директории со всем содержимым
- Поддерживаются glob-паттерны:
rm *.tmp,rm log-?.txt
Флаги и опции
| Флаг | Описание | Пример |
|---|---|---|
-r, -R, --recursive |
Рекурсивно удалять содержимое директорий. Обязателен для удаления директорий. | rm -r old_dir/ |
-f, --force |
Игнорировать несуществующие файлы, не запрашивать подтверждений, игнорировать ошибки прав доступа | rm -f *.tmp |
-i |
Запрашивать подтверждение перед каждым удалением | rm -i important.txt |
-I |
Запрашивать подтверждение один раз при удалении более 3 файлов или при рекурсии | rm -I *.log |
-v, --verbose |
Выводить имя каждого удаляемого файла | rm -rv build/ |
-d, --dir |
Удалить пустую директорию (аналог rmdir) | rm -d emptydir/ |
--no-preserve-root |
Разрешить удаление корневой директории / (крайне опасно, требует явного указания) |
rm -rf --no-preserve-root / |
--preserve-root |
Запретить рекурсивное удаление / (поведение по умолчанию) |
rm -rf --preserve-root /tmp/ |
-- |
Конец флагов: всё после -- трактуется как имена файлов (защита от имён, начинающихся с -) |
rm -- -weirdfile |
Паттерны использования
Удалить один файл
rm file.txt rm /tmp/tempfile.dat
Базовое удаление файла. Если файл защищён от записи, rm спросит подтверждение (если вывод в терминал).
Удалить файлы по шаблону
# Все .log файлы в текущей директории rm *.log # Временные файлы rm *.tmp *.bak *~
Glob-шаблоны раскрываются оболочкой перед передачей в rm. Проверьте шаблон через ls *.log перед удалением.
Удалить директорию со всем содержимым
rm -r old_project/ rm -rf build/ dist/ __pycache__/
Флаг -r обязателен для директорий. -f подавляет запросы подтверждения. Убедитесь в правильности пути!
Интерактивное удаление (безопасный режим)
rm -i *.conf # rm: remove 'app.conf'? y # rm: remove 'test.conf'? n # Одно подтверждение на всю партию rm -I *.log
Используйте -i при удалении важных данных. -I — компромисс: подтверждение только если файлов больше 3.
Удалить файлы, найденные find
# Удалить все .pyc файлы рекурсивно find . -name "*.pyc" -delete # Через xargs (быстрее для большого числа файлов) find . -name "*.tmp" | xargs rm -f # С обработкой пробелов в именах find . -name "*.log" -print0 | xargs -0 rm -f
Комбинация find + rm позволяет удалять файлы по сложным критериям: возрасту, размеру, правам доступа.
Удалить файл с именем, начинающимся с дефиса
# Использовать -- для завершения флагов rm -- -oddname.txt # Или через явный путь rm ./-oddname.txt
Файлы, начинающиеся с -, интерпретируются rm как флаги. -- сигнализирует конец опций.
Советы и предупреждения
Перед выполнением
rm *.txt запустите ls *.txt — вы увидите точный список
файлов, которые будут удалены. Это простая привычка, которая много раз спасала от случайных потерь.
Установите утилиту
trash-cli (pip install trash-cli) и используйте
trash file.txt вместо rm в повседневной работе. Файлы попадают в корзину
и их можно восстановить через trash-restore. rm оставьте для скриптов
и ситуаций, где нужно гарантированное удаление.
Добавьте
alias rm='rm -I --preserve-root' в ~/.bashrc. Флаг -I
задаёт одно подтверждение при удалении более 3 файлов или при рекурсии — достаточно безопасно
и не раздражает при удалении одного файла.
rm -rf /wrong/path, rm -rf $UNSET_VAR/ (пустая переменная даёт rm -rf /),
rm -rf . (текущая директория) — всё это необратимо. Всегда проверяйте путь
визуально. В скриптах защищайтесь: проверяйте, что переменная непустая, прежде чем включать её в путь удаления.
Разница между
rm -rf /tmp/myapp/* (удалить содержимое) и rm -rf /tmp/myapp *
(пробел вместо / — удалит и /tmp/myapp, и всё в текущей директории) — один символ.
Будьте особенно внимательны с пробелами при использовании glob в сочетании с -rf.