Risposte:
Entrambi sono un wrapper per la stessa funzione fondamentale che è una unlink()
chiamata di sistema.
Per soppesare le differenze tra le utenze utente.
rm(1)
:
unlink(1)
:
rm(1)
più argomenti.Puoi dimostrare la differenza con:
$ 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
Se tuttavia stiamo parlando di una chiamata semplice alla unlink(2)
funzione di sistema , che ora mi rendo conto probabilmente non è ciò che stai spiegando.
È possibile eseguire un sistema unlink()
su directory e file allo stesso modo. Ma se la directory è un genitore di altre directory e file, il collegamento a quel genitore verrebbe rimosso, ma i figli rimarrebbero penzoloni. Che è meno che ideale.
Modificare:
Spiacenti, ho chiarito la differenza tra unlink(1)
e unlink(2)
. La semantica continuerà a differire tra le piattaforme.
mkdir -p 1/2/3; touch 1/one 1/2/two 1/2/3/three; rm -ri 1
. Se hai scollegato la directory principale, lo spazio consumato dai figli dovrebbe essere perso fino a quando fsck non trova la discrepanza.
La parte lenta della rimozione è il codice del file system e roba del disco, non la preparazione dello spazio utente della chiamata di sistema unlink ().
Vale a dire: se la differenza di velocità è importante, non dovresti archiviare i dati nel file system.
unlink è solo una "luce" rm. rm ha più funzioni ma fanno la stessa cosa.