2009-11-27 16:43:23 +0000 2009-11-27 16:43:23 +0000
347
347
Advertisement

Jak zrobić rm, aby nie dać błędu, jeśli plik nie istnieje?

Advertisement

Piszę makefile, który wyczyści niektóre bezużyteczne pliki na końcu kompilacji. Jeśli cel został już utworzony, to oczywiście pominie ten cel, a bezużyteczny plik może go nie być. Jeśli więc zrobię to:

rm lexer.ml interpparse.ml interpparse.mli

mogę dostać błędy, ponieważ jeden z plików nie istnieje. Czy jest jakiś sposób, aby powiedzieć rm, aby zignorował te pliki?

Czytając stronę man, widzę następującą opcję:

-f Attempt to remove the files without prompting for confirma-
             tion, regardless of the file's permissions. If the file does
             not exist, do not display a diagnostic message or modify the
             exit status to reflect an error. The -f option overrides any
             previous -i options.

To brzmi jak almost to, czego chcę, ale nie jestem pewien co do części uprawnień. Czy jest jakiś sposób, żeby to zrobić?

Advertisement

Odpowiedzi (11)

296
296
296
2009-11-27 16:54:52 +0000

Opcja -f jest zdecydowanie tym, czego chcesz używać.

Potwierdzenie uprawnień do plików, do których się odnosi, jest następujące:

$ touch myfile    
$ chmod 400 myfile
$ rm myfile       
rm: remove write-protected regular empty file `myfile'?

Więc rm ostrzeże Cię, jeśli spróbujesz usunąć plik, na którym nie masz uprawnień do zapisu. Jest to dozwolone, jeśli masz uprawnienia do zapisu w katalogu, ale jest to trochę dziwne, dlatego też rm zazwyczaj Cię o tym ostrzega.

132
132
132
2015-03-09 12:39:25 +0000

Innym rozwiązaniem jest to: https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command

Wystarczy po komendzie dodać OR-statement:

rm -rf my/dir || true

W ten sposób, gdy instrukcja #1 zawiedzie (rzuca błąd), uruchom instrukcję #2, która jest po prostu true.

79
Advertisement
79
79
2012-12-23 23:12:06 +0000

Spóźniłam się na imprezę, ale używam tego cały czas. W pliku makefile, dodaj - do początku linii, aby zignorować wartość zwrotną tej linii. W ten sposób:

-rm lexer.ml interpparse.ml interpparse.mli
14
14
14
2012-06-12 19:46:48 +0000

Jeśli nie chcesz używać opcji -f, alternatywą jest:

rm filethatdoesntexist 2> /dev/null

To po prostu nie dopuści do błędów w druku.

8
Advertisement
8
8
2009-11-27 16:48:43 +0000

Jeśli znajdziesz jakiś sposób na glob nazwy plików, rm nie będzie narzekać, jeśli nie może znaleźć dopasowania. Więc coś takiego jak lexer.m* interpparse.*, itd. powinno zadziałać dla Ciebie (uważaj oczywiście, że nie usuwasz zbyt wiele). Ponadto, -f jest całkowicie rozsądnym rozwiązaniem, tak długo jak nie masz nadziei, że uprawnienia do plików zapiszą Cię przed usunięciem pliku, którego nie chciałeś - jeśli nie chcesz go usunąć, nie umieszczaj go na liście.

6
6
6
2009-11-27 19:27:29 +0000

Opcja -f oznacza, że nie zostaniesz zapytany, jeśli coś nie jest zgodne z oczekiwaniami. Nie oznacza to, że uprawnienia nie są brane pod uwagę.

Jeśli nie masz wystarczających uprawnień, aby usunąć plik, nie zostanie on usunięty.

**Ale jeśli masz wystarczające uprawnienia, aby zmienić uprawnienia, plik zostanie usunięty. Tak jest w przypadku, gdy jesteś właścicielem pliku z uprawnieniami tylko do odczytu dla właściciela (-r——–). Jako właściciel, możesz chmod u+w, a następnie usunąć go: rm -f usunie ten plik.

5
Advertisement
5
5
2011-03-11 10:36:07 +0000

Może mógłby pomóc linia podobna do:

touch fakefile.exe fakefile.o && rm *.o *.exe

Wiem, że to nie jest zbyt mądre, ale to robi pracę.

3
3
3
2015-06-11 13:55:15 +0000

Oto, czego używam w skryptach powłoki. Ukrywa on komunikat o błędzie i kod błędu.

rm doesnotexist 2> /dev/null || echo > /dev/null
3
Advertisement
3
3
2009-11-27 17:44:12 +0000

Alternatywa:

RmIfIsFile() { for f in "$@"; do [-f $f] && rm $f; done; }; RmIfIsFile lexer.ml interpparse.ml interpparse.mli

Szkoda, że pliki Makefile nie mogą udostępniać definicji funkcji powłoki w różnych liniach.

1
1
1
2017-02-02 16:11:37 +0000

Możesz dotknąć plików przed ich rm. to by je stworzyło, gdyby nie istniały :-)

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli
1
Advertisement
1
1
2017-08-19 09:47:36 +0000

write rm -rf ppp>/dev/null 2>&1you newer get error message Problem pojawia się, jeśli błąd nie zostanie wygenerowany do STDERR 2 ale STDOUT 1… Występuje, gdy komenda generuje nie błąd, lecz ostrzeżenie. Musisz ustawić filtr i usunąć ten komunikat. Ale ten przypadek jest zwyczajny.

Advertisement