Что делает rm -rf?

25

Что rm -rfделать, когда используется для удаления файлов или каталогов?

Как сделать -rи -fварианты работать вместе?

Скажи мне почему
источник
6
Почему это не спрашивалось раньше ?
Дан Даскалеску
16
@DanDascalescu Поскольку на него тривиально отвечают, прочитав man-страницу, которая должна стать первым портом захода любого пользователя для ответа на такой вопрос.
Дэвид Ричерби
9
Попробуйте и посмотрите. (Спойлер: нет.)
imallett
3
Ей-богу ! Этот вопрос должен быть шуткой от DevRobot! Как вы могли бы достичь уровня своей кармы, даже не обращаясь к страницам руководства? Теперь ... ты человек ?!
Cbhihe
2
Полностью читается как шутка. Как будто кто-то пытался спросить, "дождь сделан из H2O?" (Хороший ответ был бы: обычно да, но в будущем, когда человек уничтожит половину флоры Земли, 50% из нее превратится в кислоту (как в кислотных дождях))
синтаксическая ошибка

Ответы:

52

Команда rm -rfтакая же как rm -r -f.

С rmman-страницы (введите man rmв терминале, чтобы увидеть это) -r:

remove directories and their contents recursively

И -fделает:

ignore nonexistent files and arguments, never prompt

Таким образом, в сочетании они делают оба.

На самом деле это очень опасная команда, потому что она рекурсивно удаляет все, что находится в выбранном вами каталоге (или просто удаляет выбранный вами файл), и делает это, даже не спрашивая вас.

Пожалуйста, используйте эту команду с осторожностью!

Fabby
источник
@ Пол, что бы сделал слеш? Я использую эту команду, чтобы удалить dirs часто и без косой черты.
Осьминог
1
@Octopus, косая черта сама по себе указывает на корневой каталог. rm -rf /теоретически удалит каждый файл на вашем компьютере, который находится в каталоге, для которого у вас есть разрешение на запись. Если вы root, это значит уничтожить всю систему. (На практике это не работает, потому что в GNU rmесть особый случай, в котором отказывается разрешить, rm -r /если вы тоже не скажете --no-preserve-root.)
cjm
10
Тем не менее, я не рекомендую пытаться rm -rf /проверить, правильно ли он пойман.
CJM
2
@mattburnett В ВМ это тоже опасно: у вас могут быть монтировки, которые не являются локальными для ВМ. В частности, я считаю, что довольно часто монтировать один из каталогов хост-машины на виртуальной машине для обмена файлами между хостом и виртуальной машиной.
HVD
1
@mattburnett У меня есть виртуальные машины. У меня нет карантина виртуальной машины. Я просто не запускаю неизвестные исполняемые файлы. :)
HVd
22

В дополнение к предыдущему правильному ответу я хотел бы научить вас ловить рыбу:

Если вы не уверены, как работает команда, какие параметры есть и что она делает, откройте терминал и введите

man <command>

Например:

man rm

Оказавшись там, вы можете искать вариант. Страница man может быть очень длинной для чтения, поэтому в терминале введите:

/<pattern>

Так, например, делать:

/-f

Вы можете легко приземлиться на:

-f, --force
              ignore nonexistent files and arguments, never prompt

Для -r сделать:

-r, -R, --recursive
              remove directories and their contents recursively

Вы можете перемещаться между результатами поиска, используя n(следующий) и N(предыдущий).

Бонус:

Если вам нужно что-то сделать, но вы не знаете имя команды, используйте aproposдля поиска на страницах руководства :

apropos <pattern>

Например:

apropos directory listing
Федерико Понци
источник
8

rmявляется коротким для удаления. Этот rфлаг предназначен для рекурсивного удаления каталогов и их содержимого, а также для fпринудительного применения, и он отменяет любые запросы на подтверждение.

Крис
источник
3
Строго говоря, r flag is to remove directories это неправильно. Он удаляет каталоги вместе с их содержимым, это рекурсивная операция. По вашим словам, он будет удалять только каталоги, как насчет подкаталогов, файлов под ним? поскольку запись в каталоге содержит только сопоставление имени и индекса, это только не имеет никакого смысла ..
Heemayl
Вы правы, я отредактирую свой ответ.
Крис
1
-r рекурсивно удаляет каталоги и их содержимое .
Джим Балтер
3

Как уже упоминалось, rm -rf <ARG>предназначено для принудительного рекурсивного удаления файлов, где <ARG>находится каталог (хотя это может быть просто файл).

Весь смысл -r(рекурсивное удаление) состоит в том, что rmневозможно удалить каталоги, если они не пусты, просто потому, что основной системный вызов, который rmиспользует ( unlink ), работает только с пустыми каталогами. Таким образом, что -rделает флаг, так это поиск в глубину, спускающийся в каталоги и сначала удаляющий файлы, и только потом, когда каталог пуст - он удалит его. Этот же эффект достигается с помощью findкоманды с -deleteфлагом (когда вы не указываете фильтрацию -type, но это уже другая история).

Что касается -f, он делает две вещи - одна предотвращает запрос, хотите ли вы удалить файл или нет (например, когда вы удаляете файл, принадлежащий другому пользователю, из вашего каталога, он не будет отображать rm: remove write-protected regular empty file 'f1'?запрос подтверждения), и игнорирует несуществующие файлы. Так, например, с несуществующим именем файла вы должны получить rm: cannot remove 'nonexistent': No such file or directoryошибку.

Смотрите также:

Сергей Колодяжный
источник