Яка реальна суть опції -f на rm?


14

Читаючи сторінку man 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варіант також корисний, коли ви хочете видалити деякі файли, якщо вони існують, і не хочете байдуже, існують вони чи ні. Це дуже часто використовується в makefiles , щоб скласти команду, яка видаляє файли, які можна відновити з вихідних файлів. Наприклад, якщо 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позбавляється від необхідності сказати "так".


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

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

@DravSloan Так, це теж має сенс. Дякую за відповіді як Drav Sloan, так і slm
saliarosaurus

Я rm -fчасто використовую cleanмішень у Makefiles
Alex

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