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

Wie schaffe ich es, dass rm not give an error, wenn eine Datei nicht existiert?

Ich schreibe ein Makefile, das am Ende der Kompilierung einige nutzlose Dateien bereinigt. Wenn ein Ziel bereits erstellt wurde, wird dieses Ziel natürlich übersprungen und die nutzlose Datei ist möglicherweise nicht vorhanden. Wenn ich also dies tue:

rm lexer.ml interpparse.ml interpparse.mli

bekomme ich möglicherweise Fehler, weil eine der Dateien nicht existiert. Gibt es eine Möglichkeit, rm anzuweisen, diese Dateien zu ignorieren?

Beim Lesen der Man Page sehe ich die folgende Option:

-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.

Das klingt fast wie das, was ich will, aber ich bin mir nicht wirklich sicher über den Teil mit den Berechtigungen. Gibt es eine Möglichkeit, dies zu tun?

Antworten (11)

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

Die Option -f ist definitiv das, was Sie verwenden möchten.

Die Bestätigung über die Dateiberechtigungen, auf die sie sich bezieht, lautet wie folgt:

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

Also wird rm Sie warnen, wenn Sie versuchen, eine Datei zu löschen, für die Sie keine Schreibrechte haben. Dies ist zwar erlaubt, wenn Sie Schreibrechte auf das Verzeichnis haben, ist aber etwas seltsam, weshalb Sie normalerweise von rm gewarnt werden, wenn Sie versuchen, eine Datei zu löschen.

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

Eine andere Lösung ist diese: https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command

Fügen Sie einfach eine OR-Anweisung nach Ihrem Befehl hinzu:

rm -rf my/dir || true

Wenn Anweisung #1 fehlschlägt (Fehler auslöst), führen Sie Anweisung #2 aus, die einfach true lautet.

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

Ich komme viel zu spät zur Party, aber ich benutze das hier ständig. Fügen Sie in einem Makefile - am Anfang einer Zeile ein, um den Rückgabewert dieser Zeile zu ignorieren. Etwa so:

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

Wenn Sie die Option -f nicht verwenden möchten, ist eine Alternative:

rm filethatdoesntexist 2> /dev/null

Dies verhindert nur, dass Fehler gedruckt werden.

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

Wenn Sie einen Weg finden, glob die Dateinamen zu ermitteln, wird sich rm nicht beschweren, wenn es keine Übereinstimmung findet. Also sollte etwas wie lexer.m* interpparse.* usw. für Sie funktionieren (achten Sie natürlich darauf, dass Sie nicht zu viel löschen). Außerdem ist -f ein völlig vernünftiger Weg, solange Sie nicht hoffen, dass die Dateiberechtigungen Sie davor bewahren, eine Datei zu löschen, die Sie nicht löschen wollten - wenn Sie sie nicht löschen wollen, setzen Sie sie nicht in die Liste.

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

Die Option -f bedeutet, dass Sie nicht aufgefordert werden, wenn etwas nicht wie erwartet ist. Es bedeutet nicht, dass Berechtigungen nicht berücksichtigt werden.

Wenn Sie nicht genug Berechtigungen haben, um eine Datei zu entfernen, wird sie nicht entfernt.

BUT , wenn Sie genug Berechtigungen haben, um die Berechtigungen zu ändern, wird Ihre Datei entfernt. Dies ist der Fall, wenn Sie der Eigentümer einer Datei mit Nur-Lese-Rechten für den Eigentümer sind (-r————). Als Eigentümer können Sie chmod u+w , dann entfernen: rm -f wird diese Datei entfernen.

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

Vielleicht könnte eine ähnliche Zeile helfen mit:

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

Ich weiß, dass das nicht sehr klug ist, aber es erfüllt seine Aufgabe.

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

Hier ist, was ich in Shell-Skripten verwende. Es verbirgt die Fehlermeldung und den Fehlercode.

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

Eine Alternative:

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

Schade, dass Makefiles die Shell-Funktionsdefinitionen nicht zeilenübergreifend austauschen können.

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

Sie können die Dateien anfassen, bevor Sie sie rm., die sie erstellen würde, wenn sie nicht existieren :-)

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

write rm -rf ppp>/dev/null 2>&1you newer get Fehlermeldung Problem tritt auf, wenn Fehler nicht nach STDERR 2 sondern nach STDOUT 1 generiert wird… Es findet statt, wenn Befehl nicht Fehler, sondern Warnung generieren. Sie müssen Filter setzen und diese Meldung entfernen. Aber dieser Fall ist normal.