Jak uniemożliwić rm zgłoszenie, że plik nie został znaleziony?


155

Używam rmskryptu BASH do usuwania wielu plików. Czasami pliki nie są obecne, więc zgłasza wiele błędów. Nie potrzebuję tej wiadomości. Przeszukałem stronę podręcznika w poszukiwaniu polecenia rmuciszającego, ale jedyną opcją jaką znalazłem jest to -f, że z opisu „ignoruj ​​nieistniejące pliki, nigdy nie pytaj” wydaje się być właściwym wyborem, ale nazwa nie wydaje się pasować , więc obawiam się, że może to mieć niezamierzone konsekwencje.

  • Czy ta -fopcja jest właściwym sposobem na milczenie rm? Dlaczego to się nie nazywa -q?
  • Czy ta opcja robi coś innego?

4
nie chcesz używać -f, usuwa plik oznaczony jako tylko do odczytu.
pizza

Odpowiedzi:


209

Głównym zastosowaniem programu -fjest wymuszenie usunięcia plików, które nie zostałyby usunięte przy użyciu rmsamego programu (w szczególnym przypadku „usuwa” nieistniejące pliki, pomijając w ten sposób komunikat o błędzie).

Możesz także po prostu przekierować komunikat o błędzie za pomocą

$ rm file.txt 2> /dev/null

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


3
--fjest ważny dla GNU Coreutils rm, ale tylko dlatego, że jest unikalnym skrótem --force. Krótka forma -fjest bardziej przejrzysta i bardziej przenośna.
Keith Thompson

Nie jestem pewien, czy nawet to sobie uświadomiłem. --ftutaj jest tylko literówka dla -f.
chepner

2
co robi 2 w 2>?
Dan

@Maverick Przekierowuje wszelkie wiadomości wysyłane na stderr do / dev / null zamiast wysyłać je do terminala.
Benjamin Nolan

73

Tak, -fjest to najbardziej odpowiednia opcja.


Niektóre systemy wyświetlą monit o pojawieniu się pokoju nawet z opcją -f do użycia odwrotnego ukośnika.
vimdude

11
@vimdude: To nie jest „niektóre systemy”; że zachowanie wskazuje, że masz funkcję powłoki lub alias, który mapuje rmdo rm -i.
Keith Thompson

28

-f jest poprawną flagą, ale dla operatora testowego nie rm

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

zapewnia to, że plik istnieje i jest zwykłym plikiem (nie katalogiem, węzłem urządzenia itp.)


4
Jednak jest to sytuacja wyścigu i nie powinno być używane w skryptach produkcyjnych.
tripleee

Uważam, że @tripleee wskazuje, że test „-f” i usuwanie pliku można zakończyć w dowolnej kolejności. Innym sposobem jest if [ -f "$THEFILE" ]; then rm "$THEFILE"; fi:, co sprawia, że ​​test i kroki usuwania pliku są jawnie sekwencyjne.
robla

2
@robla ten kod robi dokładnie to samo z bardziej szczegółową składnią ... &&! = & ... Test będzie zawsze wykonywany przed rm, ale oddzielny proces może technicznie (choć bardzo mało prawdopodobne) usunąć go przed uruchomieniem rm (podczas gdy powłoka kod po interpretacji testu).
technozaur

technosaurus - ooops, masz rację. Jak myślisz, jaka jest najlepsza odpowiedź na pytanie @ mmlac?
robla

3
Aby potwierdzić, stan wyścigu jest taki, że coś może usunąć plik między testa rm. Nie ma możliwości rmwykonania wcześniej testtutaj. Patrzenie przed wykonaniem skoku jest częstym błędem w programowaniu współbieżnym - nie możesz już dłużej ufać wynikowi „spojrzenia”, kiedy faktycznie „skaczesz”; rozwiązaniem jest użycie operacji blokowania lub atomowych. Właśnie dlatego chcesz rm -f, co jest przykładem tego drugiego.
tripleee

13

\rm -f file nigdy nie zgłosi braku znalezienia.


4
-R jest niepotrzebne i niebezpieczne.
mahemoff

1
Założyłem wiele plików lub katalogów. Przeczytaj ponownie prośbę użytkownika i masz rację, że prosił tylko o pliki. Więc poprawiłem moją odpowiedź
vimdude

Co robi ukośnik odwrotny przed rm? proszę chłopaki, potrzebuję odpowiedzi na to. W systemie Windows wersja 4.1 Cygwin nie radzi sobie z \ rm, podczas gdy 3.75 działa dobrze.
Ayman Salah

2
@AymanSalah Lewy ukośnik w tym kontekście wymknąłby się jakiejkolwiek funkcji lub aliasowi zawijającemu rzeczywistość rm(co było popularne w niektórych witrynach na początku lat 90., aby uniemożliwić początkującym usuwanie rzeczy, a następnie wywoływanie administratora systemu w celu odzyskania plików).
tripleee

Dziękuję - to rozwiązało mój problem ... najwyraźniej kod wyjścia pozwala na łańcuchowe użycie, &&podczas gdy bez -f psuje się, gdy plik nie zostanie znaleziony.
Igor

5

Jeśli chodzi o rm -frobienie „czegokolwiek innego”, wymusza ( -fjest skrótem --force) ciche usunięcie w sytuacjach, w których w rminnym przypadku poprosiłbyś o potwierdzenie. Na przykład podczas próby usunięcia pliku, do którego użytkownik nie ma prawa zapisu, z katalogu, do którego użytkownik ma prawo zapisu.


-9

Miałem ten sam problem dla cshell. Jedynym rozwiązaniem, jakie miałem, było utworzenie fałszywego pliku, który pasował do wzorca przed "rm" w moim skrypcie.


7
Czy to naprawdę jedyne rozwiązanie? Próbowałeś rm -fczy rm filename >&/dev/null?
Keith Thompson
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.