Czy rm nie zgłosił braku pliku?

38

Mam skrypt bash, który chcę usunąć pliki z różnych katalogów. Często ich nie będzie, ponieważ nie zostały wygenerowane i to jest w porządku. Czy istnieje sposób, aby skrypt nie zgłaszał tego błędu, ale jeśli rm ma jakieś inne dane wyjściowe, aby to zgłosić?

Alternatywnie, czy jest lepsze polecenie do usunięcia pliku, który będzie mniej głośny?

Flickerfly
źródło

Odpowiedzi:

65

Użyj -fopcji. Po cichu zignoruje nieistniejące pliki.

Od man rm:

   -f, --force
          ignore nonexistent files and arguments, never prompt

[Część „nigdy nie pytaj” oznacza, że ​​(a) -fzastępuje wcześniej określoną opcję -ilub -Iopcję oraz (b) pliki chronione przed zapisem zostaną usunięte bez pytania.]

Przykład

Bez -f, rmbędą narzekać na brakujące pliki:

$ rm nonesuch
rm: cannot remove ‘nonesuch’: No such file or directory

Dzięki -fbędzie cicho:

$ rm -f nonesuch
$
John1024
źródło
4
Och, nowy, który nie poprosił o usunięcie, nie zdawał sobie sprawy, że zignorował również nieistnienie. Całkowicie ominąłem to, patrząc na mężczyznę. :-) Dziękuję Ci. Oznaczę to jako odpowiedź, gdy tylko pozwolę.
flickerfly
9

Jeśli wymogiem jest to, że rmnie narzekają brakujące pliki, ale chcemy także żadnego innego wyjścia z rmmoja propozycja będzie pierwszym testem dla istnienia pliku docelowego, a jedynie zadzwonić rm( bez tej -fflagi) czy plik rzeczywiście istnieje.

# rest of script
# ...
[ -e "$file" ] && rm "$file"
# ...
# rest of script

Wywołanie rm -fpliku, który na przykład nie ma uprawnień do zapisu przez użytkownika, usunie plik, a także nie wyświetli normalnego monitu dla tego scenariusza.

Jeśli chcesz użyć tego samego pomysłu z wieloma plikami, utworzę definicję funkcji, na przykład:

qrm() {
  for f
  do
    [ -e "$f" ] && rm "$f"
  done
}

Użyj tego jak: qrm file1 file2-does-not-exist *.txt etc here

Jeff Schaller
źródło
1
Warto zdawać sobie sprawę z bardzo niewielkiej szansy na wyścig, w którym plik zostanie usunięty (lub utworzony) między testem a usunięciem, ale nie mogę sobie wyobrazić, aby miało to znaczenie w typowej sytuacji, w której ktoś używałby skryptu powłoki .
David Z
7

Stwierdziłeś, że nadal chcesz zobaczyć inne dane wyjściowe rmpolecenia po jego uruchomieniu, ale użycie tej -fopcji je wyciszy. Będziesz musiał przefiltrować STDERR pod kątem tego, co chcesz, co jest trochę trudne, biorąc pod uwagę, że chcesz pokazać wszystko inne.

Będziesz chciał użyć takiego polecenia:

rm -f filename 3>&1 1>&2 2>&3 3>&- | grep -v 'No such file or directory'

Wyjaśnienie polecenia:

  • -f Argument polega na wymuszeniu, a nie monitowaniu o potwierdzenie lub błędy
  • 3>&1 1>&2 2>&3 3>&-polega na przełączaniu się między STDOUT i STDERR w celu filtrowania (możesz przeczytać więcej na ten temat tutaj, jeśli chcesz)
  • | grep -v 'No such file or directory' odfiltrowuje wiadomość, której nie chcesz widzieć

Teraz, jeśli chcesz całkowicie wyłączyć komunikaty o błędach, możesz uruchomić następującą komendę:

rm filename 2> /dev/null

To polecenie przekierowuje STDERR do / dev / null, więc nie zobaczysz go po uruchomieniu polecenia.

BriGuy
źródło
1
(AFAICS) rmbez -vwyjścia na standardowe wyjście, tylko stderr, więc w tym przypadku można po prostu 2>&1 | grepbez tańca, który jest bardziej przydatny,
dave_thompson_085 30.04.2016
4

Alternatywnie możesz użyć findpolecenia z -deleteopcją. To (oczywiście) usunie tylko znalezione pliki, więc nigdy nie ostrzega, jeśli nie ma żadnych. Przykładem może być:

find /var/log/triffids/ -name "*.log" -mtime 30 -delete

który przeszuka /var/log/triffids/katalog i usunie wszystkie pliki z .logsufiksem, które nie zostały zmodyfikowane przez ponad 30 dni.

To jest zawsze dobry pomysł, aby uruchomić te polecenia bez tej -deleteopcji po pierwsze, aby upewnić się, że znalezienie pliki można oczekiwać.

seumasmac
źródło
Podoba mi się ta opcja i rozważę zmianę. Dzięki za udostępnienie.
flickerfly 30.04.16
3

Zaznacz opcję --force( -f) rm:

-f, --force

ignoruj ​​nieistniejące pliki i argumenty, nigdy nie pytaj

heemayl
źródło
2

To jest włamanie, ale zawsze możesz touchusunąć plik. Jeśli nie istnieje, zostanie utworzony, aby rmmożna go było usunąć.

matega
źródło
Podoba mi się to, z wyjątkiem wydajności - jak kosztowne jest dotknięcie kilku K plików, a nie tylko usuwanie tych, które nie istnieją?
Dani_l
0

Możesz użyć, -fjak to będzie, zgodnie ze stroną podręcznika:

Spróbuj usunąć pliki bez pytania o potwierdzenie, niezależnie od uprawnień do pliku. Jeśli plik nie istnieje, nie wyświetlaj komunikatu diagnostycznego ani nie zmieniaj statusu wyjścia w celu odzwierciedlenia błędu. pamiętaj również, że opcja -f zastępuje wszystkie poprzednie opcje -i.

rm -f xyz-directory

nic nie podpowie i zrobi dokładnie to, co chcesz.

Ankit Jain
źródło
-1

Istnieją dwa główne sposoby: Jeśli dodasz opcję -f, nie wyświetli się błąd „nie istnieje” i dwa: (działa dla prawie każdego polecenia) zamiast po prostu wykonać polecenie „wykonaj” polecenie 2> / dev / null ”gdzie„ polecenie ”to wykonywane polecenie.

John
źródło
1
Unikałem instalacji, ponieważ nie chcę zgubić innych błędów, które mogą się pojawić. Nie wiem co by to było.
flickerfly