Was ist der Unterschied zwischen rm -r und rm -f?

10060
Cerberussian

Vom Handbuch:

  • -f, --force

    Nicht vorhandene Dateien ignorieren, niemals auffordern

  • -r, -R, --recursive

    Entfernen Sie den Inhalt von Verzeichnissen rekursiv

Obwohl diese Optionsbeschreibung unterschiedlich ist, wird beim Versuch, einen leeren Ordner zu löschen (ohne rmdir für dieses Beispiel), dasselbe Ergebnis erzielt.

-fwird kein Druckfehler oder nichts im Vergleich dazu ausgegeben -r, ist dies der einzige Unterschied oder gibt es eine bestimmte Art von Situationen, in denen eine Option besser ist als die andere oder in Situationen, in denen eine dieser Optionen einfach nicht funktioniert und die andere nicht?

0
Welches System verwenden Sie? techraf vor 8 Jahren 0
In einem leeren Verzeichnis * geben * sie das gleiche Ergebnis, da nichts zu löschen ist. Versuchen Sie es in einem Baum von Dateien und Verzeichnissen, sie werden unterschiedliche Ergebnisse liefern. Mokubai vor 8 Jahren 2
Was meinst du damit sie das gleiche Ergebnis geben? `rm -r emptydir` entfernt dieses Verzeichnis,` rm -f emptydir` nicht. Hierbei handelt es sich um zwei völlig unterschiedliche Befehlszeilenoptionen, von denen jede das tut, was in der Dokumentation angegeben ist. egmont vor 8 Jahren 0

2 Antworten auf die Frage

2
cascer1

Das sagt die Manpage in CentOS:

-f, --force ignore nonexistent files, never prompt  -r, -R, --recursive remove directories and their contents recursively 

Aus dem, was ich erhalte (dank einiger Anmerkungen unten), gilt Folgendes für die Flags -rund -f:

-r

  • löscht rekursiv den Inhalt eines Verzeichnisses, einschließlich versteckter Dateien und Unterverzeichnisse
  • Abhängig von Ihrer Konfiguration kann es um Erlaubnis fragen (z. B. bei Verwendung des --interactiveFlags). Einige Distributionen tun dies standardmäßig.
  • wenn Sie können verwendet werden, um ein Verzeichnis zu entfernen, so tun wollen, geben sie einfach den Pfad des Verzeichnisses (zB /path/to/directory)

-f

  • löscht den Inhalt eines Verzeichnisses nicht rekursiv, sondern entfernt nur Dateien, die dem angegebenen Pfad direkt entsprechen (z. B. example/file1oder example/*).
  • Löscht niemals Unterverzeichnisse
  • Bittet nie um Erlaubnis, im Grunde die yes to allin Windows

Nachfolgend einige Beispiele, die alle mit der folgenden Struktur beginnen:

example/ file1 file2 file3 .file dir/ file1 file2 file3 .file 

Ich habe für diese Beispiele standardmäßig die Ausführlichkeit und den interaktiven Modus aktiviert. Einige Distros tun dies, während andere dies nicht tun.

rm Beispiel

$ rm example rm: cannot remove `example': Is a directory 

Wie Sie sehen, werden rmVerzeichnisse standardmäßig nicht entfernt.

rm Beispiel -f

$ rm example -f rm: cannot remove `example': Is a directory 

Die Verwendung des -fFlags erlaubt es nicht, Verzeichnisse zu entfernen.

rm Beispiel -r

$ rm example -r rm: descend into directory `example'? yes rm: remove regular empty file `example/file3'? yes removed `example/file3' rm: remove regular empty file `example/file2'? yes removed `example/file2' rm: descend into directory `example/dir'? yes rm: remove regular empty file `example/dir/.file'? yes removed `example/dir/.file' rm: remove regular empty file `example/dir/file3'? yes removed `example/dir/file3' rm: remove regular empty file `example/dir/file2'? yes removed `example/dir/file2' rm: remove regular empty file `example/dir/file1'? yes removed `example/dir/file1' rm: remove directory `example/dir'? yes removed directory: `example/dir' rm: remove regular empty file `example/file1'? yes removed `example/file1' rm: remove directory `example'? yes removed directory: `example' 

Wie Sie sehen, werden Sie für jede einzelne Datei und jedes Verzeichnis um Erlaubnis gefragt. Versteckte Dateien werden ebenfalls entfernt.

rm Beispiel / * -f

$ rm example/* -f rm: cannot remove `example/dir': Is a directory removed `example/file1' removed `example/file2' removed `example/file3' 

Hier werden Sie nicht um Erlaubnis gefragt, Verzeichnisse werden nicht gelöscht und auch keine versteckten Dateien.

rm Beispiel / * -r

$ rm example/* -r rm: descend into directory `example/dir'? yes rm: remove regular empty file `example/dir/.file'? yes removed `example/dir/.file' rm: remove regular empty file `example/dir/file3'? yes removed `example/dir/file3' rm: remove regular empty file `example/dir/file2'? yes removed `example/dir/file2' rm: remove regular empty file `example/dir/file1'? yes removed `example/dir/file1' rm: remove directory `example/dir'? yes removed directory: `example/dir' rm: remove regular empty file `example/.file'? yes removed `example/file' rm: remove regular empty file `example/file1'? yes removed `example/file1' rm: remove regular empty file `example/file2'? yes removed `example/file2' rm: remove regular empty file `example/file3'? yes removed `example/file3' 

Hier wird der Inhalt des Beispielverzeichnisses (nicht das Verzeichnis selbst) einschließlich versteckter Dateien entfernt.

Das Sternchen _ not not_ impliziert unbegrenzte Rekursion. Wenn es mit den Unterverzeichnissen übereinstimmt (z. B. "example / subdir"), wird es nicht weiter herabgesetzt, und rm ignoriert _still_ diese Verzeichnisse. (Einige Muscheln haben "**", was wiederkehrt.) grawity vor 8 Jahren 0
Huh, das wusste ich nie. Ich werde die Antwort aktualisieren. cascer1 vor 8 Jahren 0
Außerdem stimmt "*" normalerweise nicht mit "Punkt" -Dateien überein (ich nehme an, es sollte "." Und ".." ignorieren, endete jedoch _all_ versteckte Dateien), daher `rm -r dir / *` allein entleert das Verzeichnis möglicherweise nicht unbedingt; Es würde zum Beispiel `dir / .git` überspringen. grawity vor 8 Jahren 0
Vielen Dank, ich glaube, ich habe die Antwort jetzt aktualisiert, um die Unterschiede zwischen "-r" und "-f" richtig anzuzeigen. Ich bin vielleicht ein wenig über Bord gegangen. cascer1 vor 8 Jahren 0
Vielen Dank für jeden Eingang (einschließlich anderer Replays)! Alle Antworten zusammen haben mir geholfen, das besser zu verstehen. Jemand hat mein Betriebssystem gefragt - ich verwende Ubuntu / Linux. Cerberussian vor 8 Jahren 0
0
techraf

rm -r mydirentfernt das mydirVerzeichnis mit seinem gesamten Inhalt.

rm -f mydirentfernt kein Verzeichnis (weder leer noch mit Inhalt). Es wird ein Fehler gemeldet:

  • unter BSD / OS X:

    rm: mydir/: is a directory 
  • unter GNU / Linux:

    rm: cannot remove 'mydir': Is a directory 

Mögliche Erklärungen für das rmBefehlsverhalten unabhängig von den angegebenen Argumenten (von den meisten bis zu den unwahrscheinlichsten):

  1. Sie haben einen Shell-Alias rmdefiniert und übergibt einige definierte Parameter (wie zB -r) an den rmBefehl
  2. Sie rufen ein aufgerufenes Skript auf, rmdas dem eigentlichen Befehl auch zusätzliche Parameter übergibt
  3. Sie haben eine benutzerdefinierte rmausführbare Datei

Sie können die ersten beiden Möglichkeiten durch Ausführen überprüfen /bin/rm -f mydir.