Ответы:
Оба являются оберткой для одной и той же фундаментальной функции, которая является unlink()
системным вызовом.
Чтобы взвесить различия между пользовательскими утилитами.
rm(1)
:
unlink(1)
:
rm(1)
нескольких аргументов.Вы можете продемонстрировать разницу с:
$ 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
Однако, если мы говорим о незапятнанном вызове системной unlink(2)
функции, который я теперь понимаю, вероятно, не то, что вы учитываете.
Вы можете использовать систему как unlink()
для каталогов, так и для файлов. Но если каталог является родительским для других каталогов и файлов, то ссылка на этого родительского элемента будет удалена, но дочерние элементы останутся висящими. Что меньше, чем идеал.
Редактировать:
Извините, уточнил разницу между unlink(1)
а unlink(2)
. Семантика все еще будет отличаться между платформами.
mkdir -p 1/2/3; touch 1/one 1/2/two 1/2/3/three; rm -ri 1
. Если вы отменили связь с родительским каталогом, тогда занимаемое потомками пространство должно быть потеряно до тех пор, пока fsck не обнаружит несоответствие.
Медленная часть удаления связана с кодом файловой системы и дисками, а не с подготовкой пользовательского пространства системным вызовом unlink ().
То есть: если разница в скорости имеет значение, то вам не следует хранить данные в файловой системе.
unlink это просто rm "light". У rm больше возможностей, но они делают то же самое.