Was ist der Unterschied zwischen unlink und rm?

64

Ist unlink schneller als rm?

Marcin
quelle
9
"Vorzeitige Optimierung ist die Wurzel allen Übels (oder zumindest des größten Teils davon) in der Programmierung." - Donald Knuth en.wikiquote.org/wiki/Donald_Knuth
chris

Antworten:

68

Beide sind ein Wrapper für dieselbe grundlegende Funktion, die ein unlink()Systemaufruf ist.

Um die Unterschiede zwischen den Userland-Anwendungen abzuwägen.

rm(1):

  • Mehr Optionen.
  • Mehr Feedback.
  • Überprüfung der geistigen Gesundheit.
  • Ein bisschen langsamer für einzelne Anrufe als Ergebnis der oben genannten.
  • Kann mit mehreren Argumenten gleichzeitig aufgerufen werden.

unlink(1):

  • Weniger Vernunftsprüfung.
  • Verzeichnisse können nicht gelöscht werden.
  • Kann nicht wiederkehren.
  • Kann immer nur ein Argument auf einmal annehmen.
  • Aufgrund seiner Einfachheit etwas schlanker für Einzelgespräche.
  • Langsamer im Vergleich zu rm(1)mehreren Argumenten.

Sie können den Unterschied demonstrieren mit:

$ touch $(seq 1 100)
$ unlink $(seq 1 100)
unlink: extra operand `2'

$ touch $(seq 1 100)
$ time rm $(seq 1 100)

real    0m0.048s
user    0m0.004s
sys     0m0.008s

$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do rm $i; done

real    0m0.207s
user    0m0.044s
sys     0m0.112s

$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do unlink $i; done

real    0m0.167s
user    0m0.048s
sys     0m0.120s

Wenn es sich jedoch um einen unverfälschten Aufruf der Systemfunktion handelt unlink(2), ist dies wahrscheinlich nicht das, wofür Sie verantwortlich sind.

Sie können ein System unlink()für Verzeichnisse und Dateien gleichermaßen ausführen . Wenn das Verzeichnis jedoch ein übergeordnetes Element für andere Verzeichnisse und Dateien ist, wird die Verknüpfung zu diesem übergeordneten Element entfernt, die untergeordneten Elemente bleiben jedoch hängen. Welches ist weniger als ideal.

Bearbeiten:

Entschuldigung, den Unterschied zwischen unlink(1)und geklärt unlink(2). Die Semantik wird sich weiterhin zwischen den Plattformen unterscheiden.

Dan Carley
quelle
Bedeutet das, dass in Unix-Dateisystemen das Entfernen eines Verzeichnisses und rekursiv aller Dateien darunter immer eine Operation ist, die proportional zur Anzahl der darin enthaltenen Dateien / Verzeichnisse ist? Wann passiert es, wenn ich die Verknüpfung eines übergeordneten Verzeichnisses mit anderen Verzeichnissen / Dateien aufhebe? Es wird nie ausgelöscht und ich habe diesen Raum für immer verloren?
Marcin
6
Es ist technisch möglich, verwaiste Verzeichnisse / Dateien auf den meisten, wenn nicht allen Dateisystemen zu belassen. Dies zu beheben bedeutet im Allgemeinen, ein Dateisystem-Reparatur-Tool auszuführen. Unter Unix / Linux sind diese Tools als 'fsck' bekannt und einige spezifische Variationen für verschiedene Dateisysteme. Wenn sie etwas wiederherstellen, belassen sie es normalerweise in einem Verzeichnis namens "lost + found"
ConcernedOfTunbridgeWells
1
Richtig. rm wird von der Unterseite des Baumes nach oben zurückkehren. Sie können zeigen , wie mit: mkdir -p 1/2/3; touch 1/one 1/2/two 1/2/3/three; rm -ri 1. Wenn Sie die Verknüpfung zum übergeordneten Verzeichnis aufheben, sollte der von den untergeordneten Verzeichnissen belegte Speicherplatz verloren gehen, bis fsck die Diskrepanz feststellt.
Dan Carley
1
Worüber redest du? $ mkdir -p 1/2/3 $ Verknüpfung aufheben 1: Verknüpfung kann nicht aufgehoben werden "1": Verursacht ein Verzeichnis-Benutzer ein "Speicher" -Leak und benötigt fsck? Unwahrscheinlich!
Thomas
1
Sowohl Linux- als auch FreeBSD-Hilfeseiten geben ausdrücklich an, dass dies fehlschlagen wird, wenn Sie versuchen, unlink () in einem Verzeichnis auszuführen.
Thomas
8

Auf der POSIX-Spezifikationsebene wird das, was rm tut, viel genauer spezifiziert als das, was die Verknüpfung aufhebt .

Die Portabilität des Ergebnisses scheint bei Verwendung von rm besser zu sein, wenn Ihr Skript auf mehreren Betriebssystemen ausgeführt werden muss.

Mike G.
quelle
4

Der langsame Teil des Entfernens ist der Dateisystemcode und das Festplattenmaterial, nicht die Vorbereitung des Unlink () - Systemaufrufs auf den Benutzerbereich.

Dh wenn der Geschwindigkeitsunterschied wichtig ist, sollten Sie die Daten nicht im Dateisystem speichern.

Unlink ist nur ein "Licht". rm hat mehr Funktionen, aber sie machen dasselbe.

Thomas
quelle