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
Möglicherweise erhalte ich eine Fehlermeldung, weil eine der Dateien nicht vorhanden ist. Gibt es eine Möglichkeit rm
, 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 hört sich fast so an, wie ich es will, aber ich bin mir nicht sicher, was die Berechtigungen angeht. Gibt es eine Möglichkeit, dies zu tun?
rm
in einer Sandbox probiert? Es sieht so aus, als würde-f
es genau das tun, was Sie wollen, unabhängig von der Verschiebung.-f
Option weiterhin, es zu löschen. Es wird scheitern. Es wird Ihnen nicht sagen, dass es fehlgeschlagen ist. Nützlich, wenn der Dateiname eine Variable oder ein Glob ist.rm --interactive=never
Aktionen, die so aussehen,rm -f
als würde sie einen Fehler-Exit-Status zurückgeben. Weitere Informationen finden Sie hier: unix.stackexchange.com/questions/72864/…Antworten:
Die
-f
Option ist definitiv das, was Sie verwenden möchten.Die Bestätigung der Dateiberechtigungen, auf die es verweist, lautet wie folgt:
So
rm
werden Sie warnen , wenn Sie versuchen , eine Datei zu löschen , die Sie haben Schreibrechte nicht auf. Dies ist zulässig, wenn Sie über Schreibberechtigungen für das Verzeichnis verfügen, ist jedoch etwas seltsam, weshalb Sierm
normalerweise gewarnt werden.quelle
-i
.set -e
in allen meinen Bash-Skripten, damit das Skript beendet wird, wenn ein Befehl einen Fehler ausgibt. Ich möchte oft, dass ein Skript mir mitteilt, obrm
ein Fehler aufgetreten ist, aber trotzdem fortfährt. geht weiter.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:
Wenn die Anweisung 1 fehlschlägt (Fehler auslöst), führen Sie auf diese Weise die Anweisung 2 aus, die einfach ist
true
.quelle
rm -rf my/dir ||:
um noch prägnanter zu sein (:
true
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:quelle
Wenn Sie die Option -f nicht verwenden möchten, ist eine Alternative:
Dies verhindert lediglich, dass Fehler gedruckt werden.
quelle
Wenn Sie einen Weg finden, die Dateinamen zu gliedern ,
rm
werden Sie sich nicht beschweren, wenn keine Übereinstimmung gefunden wird. So etwas wielexer.m* interpparse.*
usw. sollte für dich funktionieren (pass auf, dass du nicht zu viel löschst). Dies-f
ist auch ein vernünftiger Weg, solange Sie nicht hoffen, dass Dateiberechtigungen das Löschen einer Datei verhindern, die Sie nicht löschen möchten. Wenn Sie sie nicht löschen möchten, legen Sie sie nicht ab In der Liste.quelle
sudo rm -rf
.lexer.m?
...? Das würdelexer.ml
und fangenlexer.mz
, aber nichtlexer.mll
oderlexer.mla
.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 es
chmod u+w
dann entfernen:rm -f
Diese Datei wird entfernt.quelle
Vielleicht könnte eine Zeile ähnlich helfen mit:
Ich weiß, dass dies nicht sehr klug ist, aber es macht den Job.
quelle
Eine Alternative:
Schade, dass Makefiles keine zeilenübergreifenden Shell-Funktionsdefinitionen freigeben können.
quelle
Folgendes verwende ich in Shell-Skripten. Es verbirgt die Fehlermeldung und den Fehlercode.
quelle
rm doesnotexist 2&> /dev/null
Sie können die Dateien berühren, bevor Sie sie speichern. das würde sie schaffen, wenn sie nicht existieren :-)
quelle
schreibe
rm -rf ppp>/dev/null 2>&1
dir neuere bekomme Fehlermeldung Problem tritt auf, wenn Fehler nicht zu STDERR 2 sondern zu STDOUT 1 generieren ... Es findet statt, wenn Befehl nicht Fehler sondern Warnung generieren. Sie müssen Filter setzen und diese Nachricht entfernen. Aber dieser Fall ist normal.quelle
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.
Fügen Sie weitere Testklauseln hinzu, wenn Sie sicher sein möchten, dass weitere Dateien vorhanden sind.
quelle