С чего начать Первые шаги трек · 15 ступеней
Linux Labs

rm — удаление файлов и каталогов

5 мин Ubuntu 24.04 · GNU coreutils 9.4

Команда rm удаляет файлы и каталоги сразу и без корзины; ключи -i и -I спрашивают, -r удаляет дерево.

Шпаргалка

9 команд Версия для печати
  • rm notes.txt удалить файл
  • rm -i *.log спрашивать про каждый файл
  • rm -I *.log спросить один раз, если файлов больше трёх
  • rm -r old-project каталог со всем содержимым
  • rm -rf build/ без вопросов и без ошибок о несуществующем
  • rm -d empty-dir пустой каталог (как rmdir)
  • rm -v *.tmp печатать каждое удаление
  • rm -- -file.txt имя, которое начинается с минуса
  • ls *.log && rm -i *.log сначала посмотреть, потом удалить

Обзор

rm (remove) удаляет имена файлов из каталога. Корзины в терминале нет: удалённое не лежит где-то ещё, и команды «вернуть» тоже нет.

text
student@ubuntu:~$ rm -v draft.txt
removed 'draft.txt'
student@ubuntu:~$ rm old-project
rm: cannot remove 'old-project': Is a directory
student@ubuntu:~$ rm -rv old-project
removed 'old-project/readme.md'
removed directory 'old-project'

Каталог rm удаляет только с -r (рекурсивно, вместе с содержимым) или, если он пуст, с -d. Ключ -f (force) убирает вопросы и ошибки о несуществующих файлах: rm -rf молча удалит всё, что сможет.

Для удаления нужно право записи в каталог, где лежит файл. Права самого файла решают только одно: спросит ли rm подтверждение у файла, защищённого от записи.

Ключи

7

Полный список — man rm. На практике хватает -i, -I, -r, -f, -v.

Ключ Что делает Пример
-r Удалить каталог вместе со всем содержимым (то же — -R). rm -r old-project
-f Не спрашивать и молчать о несуществующих файлах. опасно rm -rf build/
-i Спрашивать подтверждение перед каждым удалением. rm -i *.log
-I Спросить один раз — если файлов больше трёх или удаление рекурсивное. rm -I *.log
-v Печатать каждое удаление — removed 'x'. rm -v *.tmp
-d Удалить пустой каталог. rm -d empty-dir
--one-file-system При рекурсивном удалении не заходить на другие смонтированные разделы. rm -r --one-file-system /mnt/old

Ничего не найдено. Попробуй запрос короче.

Рецепты

4

Проверить шаблон до удаления

bash
ls -d /var/tmp/app/*.cache     # что попадёт под шаблон
rm -v /var/tmp/app/*.cache     # то же самое, теперь удалить

Шаблон раскрывает оболочка (см. globbing), и ls с тем же шаблоном покажет ровно тот список, который получит rm.

Удалить старые файлы по возрасту

bash
find /var/log/app -name '*.log' -mtime +30 -print   # сначала список
find /var/log/app -name '*.log' -mtime +30 -delete  # потом удаление

rm не умеет выбирать по дате и размеру — это работа find.

Защита от rm -rf с пустой переменной

bash
rm -rf -- "${BUILD_DIR:?}"/*   # пустая переменная — ошибка, а не /*

${VAR:?} останавливает команду, если переменная пуста или не задана.

Удалить файл со странным именем

bash
rm -- '-rf'            # имя с минусом
rm -i ./*' '*          # имена с пробелами — с подтверждением
ls -li                 # номер inode в первой колонке
find . -inum 1234567 -delete   # удалить по номеру inode

Неполадки

6

rm: cannot remove 'dir': Is a directory

Аргумент — каталог. Пустой удаляет rm -d, с содержимым — rm -r (сначала посмотри, что внутри: ls -R dir).

rm: cannot remove: Permission denied

Нет права записи в каталог, где лежит файл. Посмотри ls -ld $(dirname путь). Системные файлы удаляют через sudo rm, но сначала убедись, что файл не нужен пакету или службе.

rm: remove write-protected regular file?

У файла нет права w. rm спрашивает, а не отказывает: ответь y или удали с -f, если уверен.

rm: cannot remove: Operation not permitted

На файле стоит атрибут «неизменяемый» (lsattr файл покажет i) или это чужой файл в каталоге с битом t, как /tmp. Снять атрибут: sudo chattr -i файл.

Место на диске не освободилось

Файл ещё открыт процессом: имя удалено, данные — нет. Найди держателя: sudo lsof +L1 — см. lsof и disk-usage. Место вернётся после перезапуска этого процесса.

Argument list too long

Под шаблон попало слишком много файлов для одной команды. Удаляй через find: find . -name '*.tmp' -delete.

Опасно

2

Восстановления нет

rm не переносит файлы в корзину. Если файл не в резервной копии и не в git, считай, что его больше нет. Перед массовым удалением — ls с тем же шаблоном или rm -I.

rm -rf с пробелом или пустой переменной

rm -rf / tmp/build (лишний пробел) просит удалить корень. От / защищает встроенная проверка (it is dangerous to operate recursively on '/'), но от /*, ~ и . защиты нет: rm -rf "$DIR"/* при пустом $DIR превращается в rm -rf /*. Пиши "${DIR:?}" и читай команду целиком перед Enter.

См. также

  • ls — посмотреть, что попадёт под удаление.
  • find — удалить по возрасту, размеру, имени во всём дереве.
  • mv — убрать файл в сторону вместо удаления.
  • globbing — как оболочка раскрывает *.log.
  • lsof — кто держит удалённый файл и место на диске.
  • files-basics — обзор базовых команд с файлами.
Загрузка…