"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.
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.
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.
Antworten:
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)
:unlink(1)
:rm(1)
mehreren Argumenten.Sie können den Unterschied demonstrieren mit:
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ärtunlink(2)
. Die Semantik wird sich weiterhin zwischen den Plattformen unterscheiden.quelle
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.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.
quelle
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.
quelle