it-swarm.com.de

Wie kann ich dafür sorgen, dass rm keinen Fehler ausgibt, wenn eine Datei nicht existiert?

Ich schreibe ein Makefile, das am Ende der Kompilierung einige nutzlose Dateien aufräumt. Wenn bereits ein Ziel erstellt wurde, wird dieses Ziel übersprungen, und die nutzlose Datei ist möglicherweise nicht vorhanden. Wenn ich das mache:

rm lexer.ml interpparse.ml interpparse.mli

Ich erhalte möglicherweise eine Fehlermeldung, weil eine der Dateien nicht vorhanden ist. Gibt es eine Möglichkeit, rm anzuweisen, diese Dateien zu ignorieren?

Beim Lesen der Manpage sehe ich 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 nach fast , was ich will, aber ich bin mir nicht sicher, was die Berechtigungen angeht. Gibt es eine Möglichkeit, dies zu tun?

307
Jason Baker

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

Die Bestätigung der Dateiberechtigungen, auf die es verweist, lautet wie folgt:

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

rm warnt Sie also, wenn Sie versuchen, eine Datei zu löschen, für die Sie keine Schreibrechte haben. Dies ist zulässig, wenn Sie über Schreibberechtigungen für das Verzeichnis verfügen, ist jedoch etwas seltsam, weshalb rm Sie normalerweise davor warnt.

266
Dave Webb

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

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

rm -rf my/dir || true

Wenn die Anweisung 1 fehlschlägt (Fehler auslöst), führen Sie auf diese Weise die Anweisung 2 aus, die einfach true ist.

110
Giel Berkers

Ich bin viel zu spät zur Party, aber ich benutze das die ganze Zeit. Fügen Sie in einem Makefile am Anfang einer Zeile - hinzu, um den Rückgabewert dieser Zeile zu ignorieren. Wie so:

-rm lexer.ml interpparse.ml interpparse.mli
74
Robert Li

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

rm filethatdoesntexist 2> /dev/null 

Dies verhindert lediglich, dass Fehler gedruckt werden.

12
user135299

Wenn Sie einen Weg zu glob den Dateinamen finden, wird sich rm nicht beschweren, wenn keine Übereinstimmung gefunden wird. So etwas wie lexer.m* interpparse.* usw. sollte für Sie funktionieren (achten Sie natürlich darauf, dass Sie nicht zu viel löschen). Außerdem ist -f ein vernünftiger Weg, solange Sie nicht hoffen, dass Sie durch Dateiberechtigungen eine Datei löschen können, die Sie nicht löschen möchten. Wenn Sie sie nicht löschen möchten, platzieren Sie sie nicht es in der Liste.

8
Nick Bastin

Die Option -f bedeutet, dass Sie nicht aufgefordert werden, wenn etwas nicht erwartet wird. Dies bedeutet nicht, dass Berechtigungen nicht berücksichtigt werden.

Wenn Sie nicht über die erforderlichen Berechtigungen zum Entfernen einer Datei verfügen, wird diese nicht entfernt.

ABER, wenn Sie über genügend Berechtigungen zum Ändern von Berechtigungen verfügen, wird Ihre Datei entfernt. Dies ist der Fall, wenn Sie der Eigentümer einer Datei mit schreibgeschützten Berechtigungen für den Eigentümer sind (-r --------). Als Eigentümer können Sie chmod u+w und dann entfernen: rm -f entfernt diese Datei.

6
mouviciel

Vielleicht könnte eine Zeile ähnlich helfen mit:

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

Ich weiß, dass dies nicht sehr klug ist, aber es macht den Job.

4
Bogdan

Eine Alternative:

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

Schade, dass Makefiles keine zeilenübergreifenden Shell-Funktionsdefinitionen freigeben können.

3
reinierpost

Folgendes verwende ich in Shell-Skripten. Es verbirgt die Fehlermeldung und den Fehlercode.

rm doesnotexist 2> /dev/null || echo > /dev/null
3
teh_senaus

schreibe rm -rf ppp>/dev/null 2>&1 du neuere bekommst eine Fehlermeldung Problem tritt auf, wenn der Fehler nicht zu STDERR 2 sondern zu STDOUT 1 generiert wird ... Es findet statt, wenn der Befehl nicht Fehler sondern Warnung generiert. Sie müssen Filter setzen und diese Nachricht entfernen. Aber dieser Fall ist normal.

1
Anatoly

sie können die Dateien berühren, bevor Sie sie speichern. das würde sie schaffen, wenn sie nicht existieren :-)

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli
1
commonpike

testen Sie, ob die Datei zuerst vorhanden ist, und übergeben Sie sie dann an rm. Dann sind die Fehler von rm aussagekräftig. -f oder Ignorieren der Fehlermeldung ist in der Regel umfassender als das, was eine Person will. -f könnte Dinge tun, die Sie nicht erledigen möchten.

if [ -f lexer.ml ]; then
  rm lexer.ml
fi

fügen Sie weitere Testklauseln hinzu, wenn Sie sicher sein möchten, dass weitere Dateien vorhanden sind.

1
user244488