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

0

Aus dem Handbuch:

  • -f, --force

    Ignorieren Sie nicht vorhandene Dateien, fordern Sie nie dazu auf

  • -r, -R, --rekursiv

    Entfernen Sie den Inhalt von Verzeichnissen rekursiv

Obwohl diese Beschreibung der Optionen unterschiedlich ist, führt der Versuch, einen leeren Ordner (in diesem Beispiel ohne rmdir) zu löschen, zum gleichen Ergebnis.

-fGibt -res einen bestimmten Typ von Situationen, in denen eine Option besser als eine andere ist, oder Situationen, in denen eine dieser Optionen einfach nicht funktioniert, während die andere nicht funktioniert?

Cerberussian
quelle
Welches System verwenden Sie?
Techraf
2
Auf ein leeres Verzeichnis sie wird das gleiche Ergebnis wie es nichts zu löschen. Probieren Sie es an einem Baum von Dateien und Verzeichnissen aus, da diese unterschiedliche Ergebnisse liefern.
Mokubai
Was meinst du damit, sie geben das gleiche Ergebnis? rm -r emptydirEntfernt dieses Verzeichnis, rm -f emptydirnicht. Hierbei handelt es sich um zwei völlig unterschiedliche Befehlszeilenoptionen, von denen jede das tut, was in der Dokumentation angegeben ist.
Egmont

Antworten:

2

Dies ist, was die Manpage in CentOS sagt:

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

-r, -R, --recursive
    remove directories and their contents recursively

Nach allem, was ich (dank einiger Kommentare unten) zusammengetragen habe, gilt für die -rund -f-Flaggen Folgendes :

-r

  • Löscht rekursiv den Inhalt eines Verzeichnisses, einschließlich versteckter Dateien und Unterverzeichnisse
  • Je nach Konfiguration werden Sie möglicherweise um Erlaubnis gebeten (z. B. bei Verwendung der --interactiveFlagge). 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 nicht rekursiv den Inhalt eines Verzeichnisses, sondern entfernt nur Dateien, die direkt mit dem angegebenen Pfad übereinstimmen (z. B. example/file1oder example/*).
  • Löscht niemals Unterverzeichnisse
  • Bitten Sie niemals 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 den ausführlichen und interaktiven Modus aktiviert. Einige Distributionen tun dies, andere nicht.

Ein Beispiel

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

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

rm Beispiel -f

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

Das Verwenden des -fFlags erlaubt es immer noch 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 gebeten. 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 gebeten, Verzeichnisse werden nicht gelöscht und versteckte Dateien auch nicht.

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) entfernt, einschließlich versteckter Dateien.

cascer1
quelle
Das Sternchen bedeutet keine uneingeschränkte Rekursion. Wenn es mit Unterverzeichnissen übereinstimmt (z. B. example/subdir), wird es nicht weiter absteigen und rm wird diese Verzeichnisse weiterhin ignorieren. (Einige Muscheln haben, **was rekursiv ist.)
Grawity
Huh, das habe ich nie gewusst. Ich werde die Antwort aktualisieren.
cascer1
Zusätzlich *passt in der Regel nicht „Punkt“ Dateien (ich nehme an, es gemeint war , zu ignorieren .und .., aber es endete ignorieren alle versteckten Dateien), also rm -r dir/*allein unter Umständen nicht unbedingt das Verzeichnis leer; es würde dir/.gitzum Beispiel überspringen .
Grawity
Vielen Dank, ich glaube, ich habe jetzt die Antwort aktualisiert, um die Unterschiede zwischen -rund richtig anzuzeigen. -fVielleicht bin ich aber etwas über Bord gegangen.
cascer1
Vielen Dank für jeden Beitrag (einschließlich anderer Wiederholungen)! Alle Antworten zusammen haben mir geholfen, das besser zu verstehen. Jemand fragte mein Betriebssystem - ich verwende Ubuntu / Linux.
Cerberussian
0

rm -r mydirentfernt das mydirVerzeichnis mit allen Inhalten.

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 rmVerhalten des Befehls unabhängig von den angegebenen Argumenten (von den wahrscheinlichsten bis zu den unwahrscheinlichsten):

  1. Sie haben einen Shell-Alias rmdefiniert und er übergibt -rdem rmBefehl einige definierte Parameter (wie )
  2. Sie rufen ein Skript auf, das aufgerufen rmwird und dem eigentlichen Befehl zusätzliche Parameter übergibt
  3. Sie haben eine benutzerdefinierte rmausführbare Datei

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

techraf
quelle