Чим відрізняється відключення від rm?


Відповіді:


68

Обидва - це обгортка тієї ж основної функції, яка є 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). Семантика все ще буде відрізнятися між платформою.


Чи означає це, що в файлових системах unix видалення каталогу та рекурсивно всіх файлів під ним завжди буде операцією, пропорційною кількості файлів / dirs, які він містить? Коли це відбувається, коли я відключаю каталог, який є батьківським для інших dirs / файлів? Це ніколи не стирається, і я втратив цей простір назавжди?
Марцін

6
Технічно можливо залишити осиротілі каталоги / файли у більшості, якщо не у всіх файлових системах. Виправити це, як правило, означає запуск інструмента для відновлення файлової системи. У Unix / Linux ці інструменти відомі як 'fsck' та деякі певні варіанти для різних файлових систем. Якщо вони відновлять щось, вони зазвичай залишать його в каталозі "загублений + знайдений"
ConcernedOfTunbridgeWells

1
Правильно. rm буде повторюватися знизу дерева вгору. Ви можете продемонструвати , як з: mkdir -p 1/2/3; touch 1/one 1/2/two 1/2/3/three; rm -ri 1. Якщо ви від’єднали батьківський каталог, тоді споживаний дітьми простір повинен бути втрачений до тих пір, поки fsck не знайде розбіжності.
Ден Карлі

1
Про що ти говориш? $ mkdir -p 1/2/3 $ unlink 1 відключення: не вдається від’єднати `1 ': Чи користувач каталогу викликає протікання" пам'яті ", вимагаючи fsck? Навряд чи!
Томас

1
І в Linux, і в FreeBSD-мапах прямо вказано, що він не вдасться при спробі запуску unlink () в каталозі.
Томас

8

На рівні специфікації POSIX те, що робить rm , задається набагато чіткіше, ніж те, що робить від’єднання .

Переносимість результату, мабуть, буде краще використовувати rm, якщо ваш сценарій повинен працювати через ОС.


4

Повільна частина видалення - це файл файлової системи та дискові речі, а не підготовка простору користувача до виклику системи unlink ().

Тобто, якщо різниця в швидкості має значення, то ви не повинні зберігати дані у файловій системі.

unlink - це лише rm "світло". rm має більше функцій, але вони роблять те саме.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.