Jaka jest różnica między unlink a rm?

64

Czy odłączenie jest szybsze niż rm?

Marcin
źródło
9
„Przedwczesna optymalizacja jest źródłem wszelkiego zła (a przynajmniej większości) w programowaniu”. - Donald Knuth en.wikiquote.org/wiki/Donald_Knuth
Chris

Odpowiedzi:

68

Oba są opakowaniem dla tej samej podstawowej funkcji, jaką jest unlink()wywołanie systemowe.

Aby zrównoważyć różnice między użytkami przestrzeni użytkownika.

rm(1):

  • Więcej opcji.
  • Więcej opinii
  • Sprawdzanie rozsądku.
  • Z tego powodu nieco wolniej dla pojedynczych połączeń.
  • Może być wywoływany z wieloma argumentami jednocześnie.

unlink(1):

  • Mniej sprawdzania rozsądku.
  • Nie można usunąć katalogów.
  • Nie można powtórzyć.
  • Może brać tylko jeden argument na raz.
  • Niewielki margines dla pojedynczych połączeń ze względu na prostotę.
  • Wolniej w porównaniu z podawaniem rm(1)wielu argumentów.

Możesz wykazać różnicę za pomocą:

$ 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

Jeśli jednak mówimy o nieskażonym wywołaniu unlink(2)funkcji systemowej , co teraz zdaję sobie sprawę, prawdopodobnie nie jest to, co rozliczasz.

Możesz wykonać system zarówno unlink()dla katalogów, jak i plików. Ale jeśli katalog jest rodzicem dla innych katalogów i plików, wówczas link do tego rodzica zostałby usunięty, ale dzieci pozostałyby wiszące. Co jest mniej niż idealne.

Edytować:

Przepraszamy, wyjaśniłem różnicę między unlink(1)i unlink(2). Semantyka nadal będzie się różnić między platformami.

Dan Carley
źródło
Czy to oznacza, że ​​w systemach plików unix usuwanie katalogu i rekursywnie wszystkie znajdujące się w nim pliki zawsze będą działaniem proporcjonalnym do liczby plików / katalogów w nim zawartych? Kiedy dzieje się, gdy rozłączam katalog nadrzędny do innych katalogów / plików? Nigdy się nie wymazuje, a ja straciłem tę przestrzeń na zawsze?
Marcin
6
Jest technicznie możliwe pozostawienie osieroconych katalogów / plików w większości, jeśli nie we wszystkich systemach plików. Naprawienie tego zazwyczaj oznacza uruchomienie narzędzia do naprawy systemu plików. W systemach Unix / Linux narzędzia te są znane jako „fsck” i niektóre specyficzne odmiany dla różnych systemów plików. Jeśli coś odzyskają, zwykle pozostawiają to w katalogu o nazwie „lost + found”
ConcernedOfTunbridgeWells
1
Poprawny. rm powróci z dołu drzewa w górę. Można wykazać, w jaki sposób z: mkdir -p 1/2/3; touch 1/one 1/2/two 1/2/3/three; rm -ri 1. Jeśli odłączyłeś katalog nadrzędny, przestrzeń zajętą ​​przez dzieci powinna zostać utracona do czasu, aż fsck znajdzie rozbieżność.
Dan Carley,
1
O czym mówisz? $ mkdir -p 1/2/3 $ unlink 1 unlink: nie można odłączyć `1 ': Czy użytkownicy katalogu powodujący przeciek pamięci wymagają fsck? Mało prawdopodobne!
Thomas
1
Zarówno strony Linux, jak i FreeBSD wyraźnie stwierdzają, że zakończy się niepowodzeniem podczas próby uruchomienia unlink () w katalogu.
Thomas
8

Na poziomie specyfikacji POSIX, to, co robi rm , jest określone o wiele bardziej ściśle niż to, co robi unlink .

Przenośność wyniku wydaje się być lepsza przy użyciu rm, jeśli twój skrypt musi działać na systemach operacyjnych.

Mike G.
źródło
4

Powolną częścią usuwania jest kod systemu plików i zawartość dysku, a nie przygotowanie przestrzeni użytkownika w wywołaniu systemowym unlink ().

Tzn .: jeśli różnica prędkości ma znaczenie, nie powinieneś przechowywać danych w systemie plików.

unlink to tylko „światło” rm. rm ma więcej funkcji, ale robią to samo.

Tomasz
źródło