Was ist der eigentliche Sinn der Option -f auf rm?


13

Wenn Sie die GNU coreutils-Manpage für lesen rm, besteht eine der Möglichkeiten darin -f,

-f, --force
          ignore nonexistent files and arguments, never prompt

Jetzt habe ich einige Tests gemacht und das in der Tat gezeigt, wenn ich so etwas benutze

rm -f /nonexisting/directory/

es wird sich nicht beschweren.

Was kann jemand wirklich von einer solchen Option profitieren?

Plus die häufigsten Beispiele für "Löschen von Verzeichnissen" mit rmist so etwas wie

 rm -rf /delete/this/dir

Die -rOption macht Sinn, aber -f?

Antworten:


8

Ich finde, dass die Manpage in diesem Fall ein wenig detailliert ist. Die -fOption von hat rmtatsächlich einige Anwendungsfälle:

  • Um einen Fehler zu vermeiden, beenden Sie den Code
  • Um nicht dazu aufgefordert zu werden
  • Berechtigungsprüfungen umgehen

Sie haben Recht, dass es sinnlos ist, eine nicht vorhandene Datei zu entfernen, aber in Skripten ist es sehr praktisch, zu sagen, "Ich möchte diese Dateien nicht, löschen Sie sie, wenn Sie sie finden, aber stören Sie mich nicht, wenn sie nicht vorhanden sind existiert nicht ". Einige Benutzer verwenden das set -ein ihrem Skript, damit es bei Fehlern nicht mehr angezeigt wird (um weiteren Schaden zu vermeiden, den das Skript verursachen kann). rm -rf /home/my/garbageDies ist einfacher als if [[ -f /home/my/garbage ]]; then rm -r /home/my/garbage; fi.

Hinweis zu Berechtigungsprüfungen: Um eine Datei zu löschen, benötigen Sie eine Schreibberechtigung für das übergeordnete Verzeichnis und nicht für die Datei selbst. Nehmen wir also an, dass sich rootin Ihrem Ausgangsverzeichnis eine Datei befindet, auf die Sie keinen sudoZugriff haben. Sie können die Datei dennoch mithilfe der -fOption entfernen . Wenn Sie Git verwenden, können Sie sehen, dass Git die Schreibberechtigung für die von ihm erstellten Objektdateien nicht belässt:

-r--r--r-- 1 phunehehe phunehehe 62 Aug 31 15:08 testdir/.git/objects/7e/70e8a2a874283163c63d61900b8ba173e5a83c

Wenn Sie also verwenden rm, ist die einzige Möglichkeit, ein Git-Repository ohne Verwendung von zu löschen root, die Verwendung von rm -rf.


4
-fvermeidet einen Fehler-Exit-Code nicht. Wenn rmversucht wird, eine vorhandene Datei zu entfernen, wird ein Fehlercode zurückgegeben.
Gilles 'SO- hör auf böse zu sein'

Ich habe diese Antwort abgelehnt, weil "Um einen Fehler-Exit-Code zu vermeiden" wie folgt geschrieben werden sollte: "Um einen Fehler-Exit-Code zu vermeiden, falls keine Dateioperanden vorhanden sind oder keine Dateioperanden vorhanden sind". Da diese Antwort jetzt geschrieben ist, ist sie falsch.
Harold Fischer

6

Das -f Option unterdrückt Bestätigungsaufforderungen beim Löschen einer schreibgeschützten Datei. Es werden auch Fehler unterdrückt, wenn eine oder mehrere bereitgestellte Dateien nicht vorhanden sind.

Die -fOption ist nützlich , wenn Sie sich bewusst sind , dass einige der Dateien , die Sie sind das Löschen nur gelesen werden können, und Sie wollen nicht darüber aufgefordert werden.

Die fOption ist auch nützlich, wenn Sie einige Dateien entfernen möchten, falls sie existieren, und sich nicht darum kümmern möchten, ob sie existieren oder nicht. Dies wird sehr häufig in Makefiles verwendet , um einen Befehl zum Entfernen von Dateien zu erstellen, die aus Quelldateien neu generiert werden können. Wenn beispielsweise foo.oaus neu erstellt werden foo.c, bar.okann von neu aufgebaut werden bar.c, und myappkann von neu aufgebaut werden foo.ound bar.odann dem Make - Datei Ziel

clean:
        rm -f *.o myapp

entfernt myapp, foo.oundbar.o wenn sie existieren und beschwert sich nicht, wenn einer von ihnen nicht existiert.

Einschließlich -fin den Anweisungen , um einen Verzeichnisbaum zu entfernen , ist nicht notwendig , in den meisten Fällen. Dies kann gerechtfertigt sein, da Sie festlegen können, -fdass bei schreibgeschützten Dateien keine Eingabeaufforderungen angezeigt werden, wenn Sie sicher sind, dass die Verzeichnisstruktur unabhängig vom Inhalt entfernt werden soll. Leute, die sagen zu rennen, rm -rfwiederholen jedoch oft nur eine mystische Beschwörung, um etwas loszuwerden, unabhängig davon, ob die Optionen -rund -ftatsächlich notwendig sind. Wenn die Optionen nicht erforderlich sind, sind sie nicht empfehlenswert, da sie das Risiko erhöhen, dass ein Tippfehler im Argument etwas Wichtiges zerstört.


3

Der -iWechsel zurm

Ich sehe im Allgemeinen die -fVerwendung mit, rmwenn der rmBefehl so ausgerichtet ist, dass er den -iSchalter für interaktive enthält. Der -fSchalter wirkt dem entgegen -i.

Beispiel

Simulieren Sie das Problem damit rm, Aliase zu sein rm -i.

$ alias rm='rm -i'

Machen Sie einige gefälschte Daten

$ touch afile

Versuchen Sie nun, es mit der Aliase-Version von zu löschen rm

$ rm afile 
rm: remove regular empty file `afile'?

Versuchen Sie es jetzt mit -f

$ rm -f afile 
$

Berechtigungen

Ich glaube auch, dass es Fälle gibt, in denen Sie nur Lesezugriff auf ein Verzeichnis haben und wenn Sie versuchen, die Dateien und / oder Unterverzeichnisse in diesem Verzeichnis zu löschen, erhalten Sie die ähnliche Aufforderung "Sind Sie sicher?". Die Verwendung von -fmacht es überflüssig, ja sagen zu müssen.


Durch die Verwendung des Alias ​​ergibt dies tatsächlich einen Sinn. Und deine Antwort stimmt mit der überein, die ich gerade in den openbsd-Manpages gezeigt habe. Obwohl openbsd nicht GNU / Linux ist, scheint es zu beschreiben, was Sie gerade gesagt haben. Hier ist der Link, wenn jemand überprüfen möchte: [link] openbsd.org/cgi-bin/…
Saliarosaurus

Mit bash können Sie immer \rmohne Aliasing ausführen (\ ist eine Verknüpfung zu dem erstellten commandProgramm). Ich finde, die beste Verwendung -fist in Shell-Skripten, wo Sie etwas wie eine Sperrdatei haben, die möglicherweise existiert oder nicht, -fstoppt die rm: cannot remove 'file': No such file or directoryWarnung.
Drav Sloan

@DravSloan Ja, das macht auch Sinn. Vielen Dank für Ihre Antworten sowohl Drav Sloan als auch slm
saliarosaurus

Ich benutze rm -foft auf das cleanZiel in Makefiles
Alex

-iist nicht wirklich das, worum es -fgeht, es ist eher ein Randfall.
Gilles 'SO- hör auf böse zu sein'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.