Vraag Wat is het verschil tussen unlink en rm?


Is het ontkoppelen sneller dan rm?


58
2017-07-10 08:49


oorsprong


"Voortijdige optimalisatie is de wortel van alle kwaad (of op zijn minst het grootste deel) in de programmering." - Donald Knuth en.wikiquote.org/wiki/Donald_Knuth - chris


antwoorden:


Beide zijn een verpakking voor dezelfde fundamentele functie die een is unlink() systeemoproep.

Om de verschillen tussen de gebruikersgebruiken te wegen.

rm(1):

  • Meer opties.
  • Meer feedback.
  • Sanity controle.
  • Een beetje trager voor enkele oproepen als gevolg van het bovenstaande.
  • Kan tegelijkertijd met meerdere argumenten worden aangeroepen.

unlink(1):

  • Minder gezond verstand controleren.
  • Kan geen mappen verwijderen.
  • Niet in staat om recurse.
  • Kan slechts één argument tegelijkertijd aannemen.
  • Minstens slechter voor enkele oproepen vanwege zijn eenvoud.
  • Langzamer vergeleken met geven rm(1) meerdere argumenten.

U zou het verschil kunnen aantonen met:

$ 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

Als we het echter hebben over een onvervalste oproep aan het systeem unlink(2) functie, waarvan ik nu besef dat dit waarschijnlijk niet is waar je verantwoordelijk voor bent.

U kunt een systeem uitvoeren unlink() op mappen en bestanden. Maar als de map een bovenliggend element is voor andere mappen en bestanden, dan zou de link naar die ouder worden verwijderd, maar de kinderen zouden worden losgelaten. Dat is minder dan ideaal.

Bewerk:

Sorry, verduidelijkt het verschil tussen unlink(1) en unlink(2). Semantiek zal nog steeds verschillen tussen platform.


61
2017-07-10 08:58



Betekent dit dat in unix-bestandssystemen een directory wordt verwijderd en recursief alle bestanden eronder altijd een bewerking zijn die evenredig is aan het aantal bestanden / mappen die het bevat? Wanneer gebeurt er wanneer ik een map ontkoppel die ouder is naar andere mappen / bestanden? Het wordt nooit weggevaagd en ik heb deze ruimte voor altijd verloren? - Marcin
Het is technisch mogelijk om op de meeste, zo niet alle bestandssystemen, verweesde mappen / bestanden achter te laten. Als u dit wilt verhelpen, betekent dit meestal dat u een reparatieprogramma voor bestandssystemen uitvoert. Op Unix / Linux staan ​​deze tools bekend als 'fsck' en enkele specifieke variaties voor verschillende bestandssystemen. Als ze iets terughalen, laten ze het normaal gesproken in een map met de naam 'lost + found' - ConcernedOfTunbridgeWells
Correct. rm zal recurse van de bodem van de boom omhoog. U kunt laten zien hoe met: mkdir -p 1/2/3; touch 1/one 1/2/two 1/2/3/three; rm -ri 1. Als u de bovenliggende map ontkoppelt, moet de door de kinderen geconsumeerde ruimte verloren zijn tot het moment dat fsck het verschil constateert. - Dan Carley
Waar heb je het over? $ mkdir -p 1/2/3 $ ontkoppeling 1 ontkoppeling: kan `1 'niet ontkoppelen: is een map Gebruikers die" geheugen "lekken veroorzakend fsck? Onwaarschijnlijk! - Thomas
Zowel Linux- als FreeBSD-manpages geven expliciet aan dat het zal falen bij het proberen om unlink () in een directory uit te voeren. - Thomas


Op het POSIX-spec-niveau, wat rm doet is veel strakker gespecificeerd dan wat ontkoppelen doet.

De overdraagbaarheid van de uitkomst lijkt waarschijnlijk beter te zijn met rm, als je script OS moet doorlopen.


6
2017-07-10 12:44





Het trage deel van het verwijderen is de code van het bestandssysteem en schijfmateriaal, niet de voorbereiding van de gebruikersruimte van de aanroep van het systeem system (unlink ().

I.e .: als het snelheidsverschil belangrijk is, moet u de gegevens niet opslaan op het bestandssysteem.

ontkoppelen is slechts een "licht". rm heeft meer functies, maar ze doen hetzelfde.


4
2017-07-10 11:46