2012-04-20 14 views
99

Używam rm w skrypcie BASH, aby usunąć wiele plików. Czasami pliki nie są obecne, więc zgłasza wiele błędów. Nie potrzebuję tej wiadomości. Przeszukałem stronę man dla polecenia, aby wyciszyć rm, ale jedyną dostępną opcją jest -f, która z opisu "ignoruj ​​nieistniejące pliki, nigdy nie pytaj" wydaje się być właściwym wyborem, ale nazwa nie wydaje się pasuje, więc jestem zaniepokojony, że może mieć niezamierzone konsekwencje.Jak zapobiec raportowaniu, że plik nie został znaleziony?

  • jest opcja -f poprawny sposób uciszyć rm? Dlaczego nie nazywa się to -q?
  • Czy ta opcja powoduje cokolwiek innego?
+0

Nie chcesz używać opcji -f, to usuwa plik oznaczony jako tylko do odczytu. – pizza

Odpowiedz

136

Głównym zastosowaniem -f jest, aby wymusić usunięcie plików, które nie można usunąć stosując rm sama (jako szczególny przypadek, że „usuwa” nieistniejących plików, tłumiąc w ten sposób komunikat o błędzie).

Można też po prostu przekierować komunikat o błędzie przy użyciu

$ rm file.txt 2> /dev/null 

(lub odpowiednik używanego systemu operacyjnego za). Możesz sprawdzić wartość $? natychmiast po wywołaniu rm, aby sprawdzić, czy plik został faktycznie usunięty, czy nie.

+3

'--f' jest poprawne dla GNU Coreutils' rm', ale tylko dlatego, że zdarza się, że jest unikalnym skrótem '--force'. Skrócona forma '-f' jest bardziej przejrzysta i bardziej przenośna. –

+0

Nie jestem pewien, czy zdałem sobie z tego sprawę. '--f' tutaj jest po prostu literówką dla' -f'. – chepner

+3

jakikolwiek powód, dla którego nie naprawiłeś literówki ??? Naprawię to ... – iconoclast

44

Tak, -f jest najbardziej odpowiednią opcją dla tego.

+0

Niektóre systemy podpowiedzą ci, kiedy masz pokój nawet z -f, dopóki nie użyjesz odwrotnego ukośnika. – vimdude

+6

@vimdude: To nie "niektóre systemy"; to zachowanie wskazuje, że masz funkcję powłoki lub alias, który odwzorowuje 'rm' na' rm -i'. –

+0

@KeithThompson true – vimdude

3

miarę rm -f robi „coś innego”, to ma siłę (-f jest skrótem --force) milczy usunięcie w sytuacjach, w których rm przeciwnym razie poprosi o potwierdzenie. Na przykład przy próbie usunięcia pliku, którego nie można zapisać, z katalogu, który jest zapisywalny przez ciebie.

8

\rm -f file nigdy nie zostanie zgłoszony.

+2

-r jest niepotrzebne i niebezpieczne. – mahemoff

+1

Założono wiele plików lub katalogów. Odzyskaj prośbę użytkownika i masz rację, pytając tylko o pliki. Więc poprawiłem moją odpowiedź – vimdude

+0

Co to jest ukośnik odwrotny przed rm? Proszę chłopaki, potrzebuję odpowiedzi na to.W systemie Windows cygwin make wersja 4.1 nie radzi sobie z \ rm, podczas gdy 3,75 działa dobrze. –

16

-f jest prawidłowa flaga, ale dla operatora testu, nie rm

[ -f "$THEFILE" ] && rm "$THEFILE" 

to gwarantuje, że plik istnieje i jest zwykłym plikiem (nie jest katalogiem, urządzenie węzeł etc ...)

+2

Jest to jednak sytuacja wyścigowa i nie należy jej używać w skryptach produkcyjnych. – tripleee

+1

Co zatem powinno być? – mmlac

-1

Miałem ten sam problem dla cshell. Jedynym rozwiązaniem, jakie miałem, było stworzenie pliku dummy pasującego do wzorca przed "rm" w moim skrypcie.

+4

Czy to było naprawdę * jedyne * rozwiązanie? Czy wypróbowałeś 'rm -f' lub' rm filename> &/dev/null'? –

Powiązane problemy