Frage Was ist der Unterschied zwischen unlink und rm?


Ist die Verknüpfung nicht schneller als rm?


58
2017-07-10 08:49


Ursprung


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


Antworten:


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

Um die Unterschiede zwischen den Userland Utilities abzuwägen.

rm(1):

  • Mehr Optionen.
  • Mehr Feedback
  • Gesundheitsprüfung.
  • Ein bisschen langsamer für einzelne Anrufe als Folge der oben genannten.
  • Kann mit mehreren Argumenten gleichzeitig aufgerufen werden.

unlink(1):

  • Weniger Überprüfung der Gesundheit.
  • Verzeichnisse konnten nicht gelöscht werden.
  • Kann nicht rekrutieren.
  • Kann immer nur ein Argument aufnehmen.
  • Marginal schlanker für einzelne Anrufe aufgrund seiner Einfachheit.
  • Im Vergleich zum Geben langsamer rm(1) mehrere Argumente.

Sie könnten 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 wir jedoch von einem unverfälschten Anruf zum System sprechen unlink(2) Funktion, die ich jetzt realisiere, ist wahrscheinlich nicht das, was du verrechnest.

Sie können ein System ausführen unlink() auf Verzeichnissen und Dateien gleichermaßen. Aber wenn das Verzeichnis ein Elternteil für andere Verzeichnisse und Dateien ist, dann würde die Verbindung zu diesem Elternteil entfernt werden, aber die Kinder würden hängen bleiben. Was ist weniger als ideal.

Bearbeiten:

Sorry, geklärt den Unterschied zwischen unlink(1) und unlink(2). Die Semantik unterscheidet sich immer noch zwischen den einzelnen Plattformen.


61
2017-07-10 08:58



Bedeutet das, dass in Unix-Dateisystemen das Entfernen eines Verzeichnisses und rekursiv alle darunter liegenden Dateien immer eine Operation ist, die proportional zur Anzahl der darin enthaltenen Dateien / Verzeichnisse ist? Wann passiert es, wenn ich ein Verzeichnis, das übergeordnet ist, von anderen Verzeichnissen / Dateien lösche? Es wird nie ausgelöscht und ich habe diesen Platz für immer verloren? - Marcin
Es ist technisch möglich, verwaiste Verzeichnisse / Dateien auf den meisten, wenn nicht allen Dateisystemen zu belassen. Dies zu beheben bedeutet in der Regel, ein Dateisystem-Reparatur-Tool auszuführen. Unter Unix / Linux sind diese Tools bekannt als 'fsck' und einige spezifische Variationen für verschiedene Dateisysteme. Wenn sie etwas wiederherstellen, lassen sie es normalerweise in einem Verzeichnis mit dem Namen 'lost + found' - ConcernedOfTunbridgeWells
Richtig. rm wird vom unteren Ende des Baumes zurückkehren. Sie können Folgendes demonstrieren: mkdir -p 1/2/3; touch 1/one 1/2/two 1/2/3/three; rm -ri 1. Wenn Sie die Verknüpfung des übergeordneten Verzeichnisses aufgehoben haben, sollte der von den untergeordneten Elementen belegte Speicherplatz so lange verloren sein, bis fsck die Diskrepanz gefunden hat. - Dan Carley
Worüber redest du? $ mkdir -p 1/2/3 $ unlink 1 unlink: kann die Verknüpfung von `1 'nicht aufheben: Ist ein Verzeichnis, in dem Benutzer Speicherlecks verursachen, fsck erforderlich? Unwahrscheinlich! - Thomas
Sowohl Linux- als auch FreeBSD-Manpages geben explizit an, dass es fehlschlägt, wenn versucht wird, unlink () in einem Verzeichnis auszuführen. - Thomas


Auf der POSIX-Spezifikationsebene was? rm does ist viel genauer angegeben als was Verknüpfung aufheben tut.

Die Portabilität des Ergebnisses scheint mit Hilfe von rm besser zu sein, wenn Ihr Skript über OS laufen muss.


6
2017-07-10 12:44





Der langsame Teil des Entfernens ist der Dateisystemcode und der Datenträgerkram, nicht die Benutzerbereichsvorbereitung des Systemaufrufs unlink ().

Wenn die Geschwindigkeitsdifferenz wichtig ist, sollten Sie die Daten nicht im Dateisystem speichern.

unlink ist nur ein rm "light". rm hat mehr Funktionen, aber sie machen das Gleiche.


4
2017-07-10 11:46