Відповіді:
Обидва - це обгортка тієї ж основної функції, яка є 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 не знайде розбіжності.
На рівні специфікації POSIX те, що робить rm , задається набагато чіткіше, ніж те, що робить від’єднання .
Переносимість результату, мабуть, буде краще використовувати rm, якщо ваш сценарій повинен працювати через ОС.
Повільна частина видалення - це файл файлової системи та дискові речі, а не підготовка простору користувача до виклику системи unlink ().
Тобто, якщо різниця в швидкості має значення, то ви не повинні зберігати дані у файловій системі.
unlink - це лише rm "світло". rm має більше функцій, але вони роблять те саме.