Wie kann verhindert werden, dass rm meldet, dass eine Datei nicht gefunden wurde?

155

Ich verwende rminnerhalb eines BASH-Skripts, um viele Dateien zu löschen. Manchmal sind die Dateien nicht vorhanden, sodass viele Fehler gemeldet werden. Ich brauche diese Nachricht nicht. Ich habe die Manpage nach einem Befehl durchsucht, um rmleise zu machen , aber die einzige Option, die ich gefunden habe, ist -f, dass aus der Beschreibung "Nicht vorhandene Dateien ignorieren, nie auffordern" die richtige Wahl zu sein scheint, aber der Name nicht zu passen scheint Ich befürchte daher, dass dies unbeabsichtigte Folgen haben könnte.

  • Ist die -fOption der richtige Weg zum Schweigen rm? Warum heißt es nicht -q?
  • Macht diese Option noch etwas?
Dorf
quelle
4
Wenn Sie -f nicht verwenden möchten, werden Dateien entfernt, die Sie als schreibgeschützt markiert haben.
Pizza

Antworten:

209

Die Hauptanwendung -fbesteht darin, das Entfernen von Dateien zu erzwingen, die nicht rmvon selbst entfernt werden würden (in einem besonderen Fall werden nicht vorhandene Dateien "entfernt", wodurch die Fehlermeldung unterdrückt wird).

Sie können die Fehlermeldung auch einfach mit umleiten

$ rm file.txt 2> /dev/null

(oder das Äquivalent Ihres Betriebssystems). Sie können den Wert von $? unmittelbar nach dem Aufruf überprüfen , rmum festzustellen, ob eine Datei tatsächlich entfernt wurde oder nicht.

chepner
quelle
3
--fgilt für GNU Coreutils rm, aber nur, weil es sich um eine eindeutige Abkürzung für handelt --force. Die Kurzform -fist klarer und tragbarer.
Keith Thompson
Ich bin mir nicht sicher, ob ich das überhaupt bemerkt habe. --fHier ist nur ein Tippfehler für -f.
Chepner
2
Was macht die 2 in 2>?
Dan
@Maverick Leitet alle an stderr gesendeten Nachrichten an / dev / null um, anstatt sie an das Terminal zu senden.
Benjamin Nolan
72

Ja, -fist die am besten geeignete Option dafür.

Satya
quelle
Einige Systeme werden Sie sogar mit -f auffordern, bis Platz ist, bis Sie Backslash verwenden.
Vimdude
11
@vimdude: Es sind nicht "einige Systeme"; dieses Verhalten zeigt an, dass Sie eine Shell - Funktion oder Alias haben , die Karten rmzu rm -i.
Keith Thompson
27

-f ist das richtige Flag, aber für den Testoperator nicht rm

[ -f "$THEFILE" ] && rm "$THEFILE"

Dies stellt sicher, dass die Datei existiert und eine reguläre Datei ist (kein Verzeichnis, Geräteknoten usw.)

Technosaurus
quelle
4
Dies hat jedoch eine Race-Bedingung und sollte nicht in Produktionsskripten verwendet werden.
Tripleee
Ich glaube, @tripleee weist darauf hin, dass der "-f" -Test und das Entfernen der Datei in beliebiger Reihenfolge abgeschlossen werden können. Eine andere Möglichkeit ist : if [ -f "$THEFILE" ]; then rm "$THEFILE"; fi, wodurch die Schritte zum Testen und Entfernen von Dateien explizit sequentiell ausgeführt werden.
Robla
2
@robla dieser Code macht genau das Gleiche mit ausführlicherer Syntax ... &&! = & ... Der Test wird immer vor rm stattfinden, aber ein separater Prozess könnte ihn technisch (wenn auch sehr unwahrscheinlich) löschen, bevor rm ausgeführt wird (während die Shell Code, nachdem der Test interpretiert wurde).
Technosaurus
Technosaurus - ooops, du hast recht. Was ist Ihrer Meinung nach die beste Antwort auf die Frage von @ mmlac?
Robla
3
Und nur um zu bestätigen, ist die Rennbedingung, dass etwas die Datei zwischen testund entfernen könnte rm. Es gibt keine Möglichkeit rm, zuvor testhier auszuführen . Ein Blick vor dem Sprung ist ein häufiger Fehler bei der gleichzeitigen Programmierung. Sie können dem Ergebnis des "Blicks" nicht mehr vertrauen, wenn Sie tatsächlich "springen". Die Lösung hierfür besteht darin, Sperr- oder Atomoperationen zu verwenden. Welches ist genau der Grund rm -f, warum Sie wollen , was ein Beispiel für Letzteres ist.
Tripleee
13

\rm -f file wird nie berichten nicht gefunden.

vimdude
quelle
4
Das -r ist unnötig und gefährlich.
Mahemoff
1
Ich habe viele Dateien oder Verzeichnisse angenommen. Lesen Sie die Anfrage des Benutzers erneut und Sie haben Recht, er hat nur nach Dateien gefragt. Also korrigierte meine Antwort
vimdude
Was ist der Backslash vor dem rm? Bitte Leute, ich brauche eine Antwort darauf. Unter Windows kann Cygwins Make-Version 4.1 nicht mit \ rm umgehen, während 3.75 einwandfrei funktioniert.
Ayman Salah
2
@AymanSalah Der Backslash in diesem Kontext würde jeder Funktion oder jedem Alias ​​entgehen, der das Reale umschließt rm(wie es auf einigen Websites in den frühen 1990er Jahren beliebt war, um zu verhindern, dass Anfänger Inhalte entfernen und dann den Systemadministrator aufrufen, um ihre Dateien zurückzubekommen).
Tripleee
Vielen Dank - dies hat mein Problem gelöst. Anscheinend ermöglicht der Exit-Code die Verkettung mit, &&während -f es bricht, sobald die Datei nicht gefunden wird.
Igor
5

Wenn Sie rm -f"irgendetwas anderes" tun, -fwird --forcein Situationen, in denen Sie rmsonst um Bestätigung gebeten würden, eine stille Entfernung erzwungen ( Abkürzung für ) . Wenn Sie beispielsweise versuchen, eine von Ihnen nicht beschreibbare Datei aus einem von Ihnen beschreibbaren Verzeichnis zu entfernen.

Idelic
quelle
-9

Ich hatte das gleiche Problem für cshell. Die einzige Lösung, die ich hatte, bestand darin, eine Dummy-Datei zu erstellen, die dem Muster vor "rm" in meinem Skript entsprach.

Niranjan
quelle
7
War das wirklich die einzige Lösung? Hast du es versucht rm -foder rm filename >&/dev/null?
Keith Thompson