В чем же смысл опции -f на rm?


14

Читая справочную страницу GNU coreutils для rm, вы можете выбрать один из вариантов -f, который согласно инструкции,

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

Теперь я сделал несколько тестов и показал, что действительно, если я использую что-то вроде

rm -f /nonexisting/directory/

это не будет жаловаться.

Что на самом деле может получить кто-то от такой возможности?

Плюс наиболее распространенные примеры «удаления каталогов» rm- это что-то вроде

 rm -rf /delete/this/dir

-rОпция имеет смысл, но -f?

Ответы:


9

Я считаю, что на странице руководства в этом случае не хватает мелочей. -fВариант на rmсамом деле имеет довольно много случаев использования:

  • Чтобы избежать ошибки код выхода
  • Чтобы избежать запроса
  • Чтобы обойти проверки разрешений

Вы правы, что бессмысленно удалять несуществующий файл, но в сценариях действительно удобно иметь возможность сказать: «Я не хочу эти файлы, удалите их, если найдете, но не мешайте мне, если они не не существует ". Некоторые люди используют set -eв своем скрипте, так что он остановится на любой ошибке (чтобы избежать дальнейшего ущерба, который может вызвать скрипт), и rm -rf /home/my/garbageэто проще, чем if [[ -f /home/my/garbage ]]; then rm -r /home/my/garbage; fi.

Примечание о проверке разрешений: для удаления файла необходимо разрешение на запись в родительский каталог, а не в сам файл. Итак, допустим, что rootв вашем домашнем каталоге есть файл, которым вы владеете, и у вас нет sudoдоступа, вы все равно можете удалить файл, используя -fопцию. Если вы используете Git, вы увидите, что Git не оставляет разрешения на запись в создаваемых им объектных файлах:

-r--r--r-- 1 phunehehe phunehehe 62 Aug 31 15:08 testdir/.git/objects/7e/70e8a2a874283163c63d61900b8ba173e5a83c

Поэтому, если вы используете rm, единственный способ удалить Git-репозиторий без использования root- это использовать rm -rf.


4
-fне избегает ошибки кода выхода. Если rmпопытаться удалить существующий файл не удастся, он вернет код ошибки.
Жиль "ТАК - перестань быть злым"

Я отклонил этот ответ, потому что «Чтобы избежать кода выхода из ошибки» следует записать как «Чтобы избежать кода выхода из ошибки в случае, если нет файловых операндов или файловые операнды не существуют». Поскольку этот ответ написан сейчас, это неправильно.
Гарольд Фишер

6

-fОпция подавляет сообщения подтверждения при удалении файла только для чтения. Он также подавляет ошибки, когда один или несколько предоставленных файлов не существуют.

Эта -fопция полезна, когда вы знаете, что некоторые файлы, которые вы удаляете, могут быть доступны только для чтения, и вы не хотите, чтобы вас об этом спрашивали.

Эта fопция также полезна, когда вы хотите удалить некоторые файлы, если они существуют, и не хотите заботиться о том, существуют они или нет. Это очень часто используется в make-файлах для создания команды, которая удаляет файлы, которые можно восстановить из исходных файлов. Например, если он foo.oможет быть восстановлен из foo.c, bar.oможет быть восстановлен из bar.c, и myappможет быть восстановлен из foo.oи bar.o, тогда цель makefile

clean:
        rm -f *.o myapp

удаляет myapp, foo.oи bar.oесли они существуют, и не жалуется, если какой-либо из них не существует.

В том числе -fв инструкции по удалению дерева каталогов нет необходимости в большинстве случаев. Это может быть оправдано, потому что, если вы уверены, что хотите удалить это дерево каталогов, независимо от того, что в нем находится, вы можете указать, -fчтобы не получать запросы в случае, если некоторые файлы доступны только для чтения. Однако люди, которые говорят «бежать» rm -rf, часто просто повторяют мистическое заклинание, чтобы избавиться от чего-либо, независимо от того, есть ли варианты -rи -fдействительно ли они необходимы. Если параметры не нужны, они не рекомендуется, потому что они увеличивают риск того, что опечатка в аргументе уничтожит что-то важное.


3

-iПереключатель вrm

Я обычно вижу -f, rmкогда используется rmкоманда с псевдонимом, так что он включает -iпереключатель для интерактивного. -fПереключатель противодействует -i.

пример

Имитация проблемы с rmпсевдонимами rm -i.

$ alias rm='rm -i'

Сделайте некоторые поддельные данные

$ touch afile

Теперь попробуйте удалить его, используя псевдонимы версии rm

$ rm afile 
rm: remove regular empty file `afile'?

Теперь попробуйте использовать -f

$ rm -f afile 
$

права доступа

Также я полагаю, что есть случаи, когда у вас есть доступ только для чтения к каталогу, и когда вы пытаетесь удалить файлы и / или подкаталоги в указанном каталоге, вам будет выдан аналогичный запрос «Вы уверены?». Использование -fизбавляет от необходимости говорить да.


Использование псевдонима действительно имеет смысл. И ваш ответ соответствует тому, что я только что показал на страницах справки openbsd. Хотя openbsd не GNU / Linux, похоже, он описывает то, что вы только что сказали. Вот ссылка, если кто-то хотел бы проверить: [ссылка] openbsd.org/cgi-bin/…
saliarosaurus

С bash вы всегда \rmможете запустить без псевдонимов (\ ярлык для commandвстроенного). Я считаю, что лучше всего использовать для -fсценариев оболочки, где у вас есть что-то, например, файл блокировки, который может существовать или не существовать, -fостанавливает rm: cannot remove 'file': No such file or directoryпредупреждение.
Драв Слоан

@DravSloan Да, это тоже имеет смысл. Спасибо за ваши ответы, как Драв Слоан, так и
slm

Я rm -fчасто использую на cleanцели в Makefileс
Алекс

-iна самом деле -fне о чем, это скорее крайний случай.
Жиль "ТАК - перестань быть злым"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.