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

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

Aus dem Handbuch:

  • -f, --force

    nicht vorhandene Dateien ignorieren, nie nachfragen

  • -r, -R, --recursive

    den Inhalt von Verzeichnissen rekursiv entfernen

Obwohl die Beschreibung dieser Optionen anders ist, führt der Versuch, einen leeren Ordner zu löschen (in diesem Beispiel ohne rmdir), zum selben Ergebnis.

-fdruckt im Vergleich zu keinen Fehler oder irgendetwas anderes -r. Ist das der einzige Unterschied oder gibt es bestimmte Situationen, in denen eine Option besser als eine andere ist, oder Situationen, in denen eine der Optionen einfach nicht funktioniert, während die andere funktioniert?

Antwort1

Dies ist, was die Manpage in CentOS sagt:

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

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

Soweit ich es verstehe (dank einiger Kommentare 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 sein, dass Sie um Erlaubnis gebeten werden (beispielsweise bei Verwendung des --interactiveFlags). Einige Distributionen tun dies standardmäßig.
  • kann verwendet werden, um ein Verzeichnis zu entfernen. Wenn Sie dies tun möchten, geben Sie einfach den Pfad des Verzeichnisses an (zum Beispiel: /path/to/directory)

-F

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

Nachfolgend finden Sie einige Beispiele. Sie beginnen alle mit der folgenden Struktur:

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

Für diese Beispiele habe ich die Ausführlichkeit und den interaktiven Modus standardmäßig aktiviert. Einige Distributionen tun dies, andere nicht.

rm Beispiel

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

Wie Sie sehen, rmwerden standardmäßig keine Verzeichnisse entfernt.

rm Beispiel -f

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

Die Verwendung des -fFlags ermöglicht weiterhin nicht das Entfernen von Verzeichnissen.

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 einzelne Verzeichnis um Berechtigung 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'

Hierbei werden keine Berechtigungen abgefragt, Verzeichnisse werden nicht gelöscht und auch versteckte Dateien 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.

Antwort2

rm -r mydirentfernt das mydirVerzeichnis mit seinem gesamten Inhalt.

rm -f mydirlöscht 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 der wahrscheinlichsten bis zur unwahrscheinlichsten):

  1. Sie haben einen Shell-Alias rm​​definiert und dieser übergibt einige definierte Parameter (wie -r) an den rmBefehl
  2. Sie rufen ein Skript auf rm, das dem eigentlichen Befehl noch weitere 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.

verwandte Informationen