Я считаю, что на странице руководства в этом случае не хватает мелочей. -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.
-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действительно ли они необходимы. Если параметры не нужны, они не рекомендуется, потому что они увеличивают риск того, что опечатка в аргументе уничтожит что-то важное.
Я обычно вижу -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не о чем, это скорее крайний случай.
-f
не избегает ошибки кода выхода. Еслиrm
попытаться удалить существующий файл не удастся, он вернет код ошибки.-f
Опция подавляет сообщения подтверждения при удалении файла только для чтения. Он также подавляет ошибки, когда один или несколько предоставленных файлов не существуют.Эта
-f
опция полезна, когда вы знаете, что некоторые файлы, которые вы удаляете, могут быть доступны только для чтения, и вы не хотите, чтобы вас об этом спрашивали.Эта
f
опция также полезна, когда вы хотите удалить некоторые файлы, если они существуют, и не хотите заботиться о том, существуют они или нет. Это очень часто используется в make-файлах для создания команды, которая удаляет файлы, которые можно восстановить из исходных файлов. Например, если онfoo.o
может быть восстановлен изfoo.c
,bar.o
может быть восстановлен изbar.c
, иmyapp
может быть восстановлен изfoo.o
иbar.o
, тогда цель makefileудаляет
myapp
,foo.o
иbar.o
если они существуют, и не жалуется, если какой-либо из них не существует.В том числе
-f
в инструкции по удалению дерева каталогов нет необходимости в большинстве случаев. Это может быть оправдано, потому что, если вы уверены, что хотите удалить это дерево каталогов, независимо от того, что в нем находится, вы можете указать,-f
чтобы не получать запросы в случае, если некоторые файлы доступны только для чтения. Однако люди, которые говорят «бежать»rm -rf
, часто просто повторяют мистическое заклинание, чтобы избавиться от чего-либо, независимо от того, есть ли варианты-r
и-f
действительно ли они необходимы. Если параметры не нужны, они не рекомендуется, потому что они увеличивают риск того, что опечатка в аргументе уничтожит что-то важное.источник
-i
Переключатель вrm
Я обычно вижу
-f
,rm
когда используетсяrm
команда с псевдонимом, так что он включает-i
переключатель для интерактивного.-f
Переключатель противодействует-i
.пример
Имитация проблемы с
rm
псевдонимамиrm -i
.Сделайте некоторые поддельные данные
Теперь попробуйте удалить его, используя псевдонимы версии
rm
Теперь попробуйте использовать
-f
права доступа
Также я полагаю, что есть случаи, когда у вас есть доступ только для чтения к каталогу, и когда вы пытаетесь удалить файлы и / или подкаталоги в указанном каталоге, вам будет выдан аналогичный запрос «Вы уверены?». Использование
-f
избавляет от необходимости говорить да.источник
\rm
можете запустить без псевдонимов (\ ярлык дляcommand
встроенного). Я считаю, что лучше всего использовать для-f
сценариев оболочки, где у вас есть что-то, например, файл блокировки, который может существовать или не существовать,-f
останавливаетrm: cannot remove 'file': No such file or directory
предупреждение.rm -f
часто использую наclean
цели вMakefile
с-i
на самом деле-f
не о чем, это скорее крайний случай.