Uważam, że w tej stronie podręcznika brakuje drobnych szczegółów. -fOpcja rmrzeczywiście ma sporo przypadków użycia:
Aby uniknąć błędu kodu wyjścia
Aby uniknąć monitu
Aby ominąć kontrole uprawnień
Masz rację, że nie ma sensu usuwać nieistniejącego pliku, ale w skryptach wygodnie jest móc powiedzieć: „Nie chcę tych plików, usuń je, jeśli je znajdziesz, ale nie zawracaj mi głowy, jeśli nie „istnieje”. Niektóre osoby używają set -eskryptu, aby zatrzymał się na każdym błędzie (aby uniknąć dalszych szkód, jakie skrypt może spowodować) i rm -rf /home/my/garbagejest łatwiejszy niż if [[ -f /home/my/garbage ]]; then rm -r /home/my/garbage; fi.
Uwaga na temat sprawdzania uprawnień: aby usunąć plik, musisz mieć uprawnienia do zapisu do katalogu nadrzędnego , a nie do samego pliku. Powiedzmy, że rootw twoim katalogu domowym znajduje się plik należący do Ciebie i nie masz sudodostępu, nadal możesz go usunąć za pomocą -fopcji. Jeśli używasz Git, możesz zobaczyć, że Git nie pozostawia uprawnień do zapisu w tworzonych plikach obiektowych:
-r--r--r-- 1 phunehehe phunehehe 62 Aug 31 15:08 testdir/.git/objects/7e/70e8a2a874283163c63d61900b8ba173e5a83c
Więc jeśli używasz rm, jedynym sposobem na usunięcie repozytorium Git bez użycia rootjest użycie rm -rf.
-fnie omija kodu wyjścia błędu. Jeśli rmpróba usunięcia istniejącego pliku nie powiedzie się, zwróci kod błędu.
Gilles „SO- przestań być zły”
Głosowałem za odpowiedzią, ponieważ „Aby uniknąć błędu kodu wyjścia” należy napisać jako „Aby uniknąć błędu kodu wyjścia w przypadku, gdy nie ma operandów plików lub operandy plików nie istnieją”. Ponieważ ta odpowiedź jest teraz napisana, jest błędna.
Harold Fischer,
6
Ta -fopcja pomija monity o potwierdzenie podczas usuwania pliku tylko do odczytu. Pomija także błędy, gdy co najmniej jeden dostarczony plik nie istnieje.
Ta -fopcja jest przydatna, gdy zdajesz sobie sprawę, że niektóre usuwane pliki mogą być tylko do odczytu i nie chcesz otrzymywać monitów.
Ta fopcja jest również przydatna, gdy chcesz usunąć niektóre pliki, jeśli istnieją, i nie chcesz się martwić, czy istnieją. Jest to bardzo często używane w plikach makefiles , aby wykonać polecenie, które usuwa pliki, które można ponownie wygenerować z plików źródłowych. Na przykład, foo.omogą zostać odtworzone z foo.c, bar.omogą zostać odtworzone z bar.ci myappmogą zostać odtworzone z foo.oa bar.o, a potem w celu makefile
clean:
rm -f *.o myapp
usuwa myapp, foo.oa bar.ojeśli istnieją i nie narzeka, jeśli żaden z nich nie istnieje.
W -fwiększości przypadków dołączenie instrukcji usuwania drzewa katalogów nie jest konieczne. Można to uzasadnić, ponieważ jeśli jesteś pewien, że chcesz usunąć to drzewo katalogów niezależnie od tego, co w nim jest, możesz określić, -faby uniknąć monitowania w przypadku, gdy niektóre pliki są tylko do odczytu. Jednak ludzie, którzy mówią, aby uciec, rm -rfczęsto powtarzają mistyczne zaklęcie, aby się czegoś pozbyć, niezależnie od tego, czy opcje -ri -fsą rzeczywiście konieczne. Jeśli opcje nie są konieczne, nie są wskazane, ponieważ zwiększają ryzyko, że literówka w argumencie zniszczy coś ważnego.
Zazwyczaj widzę, że -fjest używany, rmgdy rmpolecenie jest aliasowane, więc zawiera -iprzełącznik do interaktywnego. -fPrzełącznik przeciwdziała -i.
Przykład
Symuluj problem z rmaliasami do rm -i.
$ alias rm='rm -i'
Zrób fałszywe dane
$ touch afile
Teraz spróbuj go usunąć, używając wersji aliasów rm
$ rm afile
rm: remove regular empty file `afile'?
Teraz spróbuj użyć -f
$ rm -f afile
$
Uprawnienia
Sądzę również, że istnieją przypadki, w których masz dostęp tylko do odczytu do katalogu, a gdy spróbujesz usunąć pliki i / lub podkatalogi z tego katalogu, pojawi się podobne pytanie „jesteś pewien?”. Wykorzystanie -fpozbywa się konieczności powiedzenia „tak”.
Używanie aliasu ma sens. Twoja odpowiedź pasuje do tego, co właśnie pokazałem na stronach podręcznika openbsd. Chociaż openbsd nie jest GNU / Linux, wydaje się, że opisuje to, co właśnie powiedziałeś. Oto link, jeśli ktoś chciałby to sprawdzić: [link] openbsd.org/cgi-bin/…
saliarosaurus
Dzięki bash zawsze możesz \rmuruchomić bez aliasingu (\ jest skrótem do commandwbudowanego). Uważam, że najlepiej nadają się do -fskryptowania powłoki, gdzie masz coś takiego, jak plik blokujący, który może istnieć lub nie, -fzatrzymuje rm: cannot remove 'file': No such file or directoryostrzeżenie.
Drav Sloan,
@DravSloan Tak, to też ma sens. Dziękuję za odpowiedzi zarówno Drav Sloan, jak i slm
saliarosaurus
Używam rm -fczęsto na cleancelu w Makefiles
Alex
-itak naprawdę nie -fo to chodzi, to raczej przypadek na krawędzi.
-f
nie omija kodu wyjścia błędu. Jeślirm
próba usunięcia istniejącego pliku nie powiedzie się, zwróci kod błędu.Ta
-f
opcja pomija monity o potwierdzenie podczas usuwania pliku tylko do odczytu. Pomija także błędy, gdy co najmniej jeden dostarczony plik nie istnieje.Ta
-f
opcja jest przydatna, gdy zdajesz sobie sprawę, że niektóre usuwane pliki mogą być tylko do odczytu i nie chcesz otrzymywać monitów.Ta
f
opcja jest również przydatna, gdy chcesz usunąć niektóre pliki, jeśli istnieją, i nie chcesz się martwić, czy istnieją. Jest to bardzo często używane w plikach makefiles , aby wykonać polecenie, które usuwa pliki, które można ponownie wygenerować z plików źródłowych. Na przykład,foo.o
mogą zostać odtworzone zfoo.c
,bar.o
mogą zostać odtworzone zbar.c
imyapp
mogą zostać odtworzone zfoo.o
abar.o
, a potem w celu makefileusuwa
myapp
,foo.o
abar.o
jeśli istnieją i nie narzeka, jeśli żaden z nich nie istnieje.W
-f
większości przypadków dołączenie instrukcji usuwania drzewa katalogów nie jest konieczne. Można to uzasadnić, ponieważ jeśli jesteś pewien, że chcesz usunąć to drzewo katalogów niezależnie od tego, co w nim jest, możesz określić,-f
aby uniknąć monitowania w przypadku, gdy niektóre pliki są tylko do odczytu. Jednak ludzie, którzy mówią, aby uciec,rm -rf
często powtarzają mistyczne zaklęcie, aby się czegoś pozbyć, niezależnie od tego, czy opcje-r
i-f
są rzeczywiście konieczne. Jeśli opcje nie są konieczne, nie są wskazane, ponieważ zwiększają ryzyko, że literówka w argumencie zniszczy coś ważnego.źródło
-i
Przełącznikrm
Zazwyczaj widzę, że
-f
jest używany,rm
gdyrm
polecenie jest aliasowane, więc zawiera-i
przełącznik do interaktywnego.-f
Przełącznik przeciwdziała-i
.Przykład
Symuluj problem z
rm
aliasami dorm -i
.Zrób fałszywe dane
Teraz spróbuj go usunąć, używając wersji aliasów
rm
Teraz spróbuj użyć
-f
Uprawnienia
Sądzę również, że istnieją przypadki, w których masz dostęp tylko do odczytu do katalogu, a gdy spróbujesz usunąć pliki i / lub podkatalogi z tego katalogu, pojawi się podobne pytanie „jesteś pewien?”. Wykorzystanie
-f
pozbywa się konieczności powiedzenia „tak”.źródło
\rm
uruchomić bez aliasingu (\ jest skrótem docommand
wbudowanego). Uważam, że najlepiej nadają się do-f
skryptowania powłoki, gdzie masz coś takiego, jak plik blokujący, który może istnieć lub nie,-f
zatrzymujerm: cannot remove 'file': No such file or directory
ostrzeżenie.rm -f
często naclean
celu wMakefile
s-i
tak naprawdę nie-f
o to chodzi, to raczej przypadek na krawędzi.