„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.
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.
Odpowiedzi:
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)
:unlink(1)
:rm(1)
wielu argumentów.Możesz wykazać różnicę za pomocą:
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)
iunlink(2)
. Semantyka nadal będzie się różnić między platformami.źródło
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ść.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.
źródło
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.
źródło