В чем разница между unlink и rm?

64

Разве unlink немного быстрее чем rm?

Marcin
источник
9
«Преждевременная оптимизация - корень всего зла (или, по крайней мере, большей его части) в программировании». - Дональд Кнут en.wikiquote.org/wiki/Donald_Knuth
Крис

Ответы:

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 удаление каталога и рекурсивно всех файлов в нем всегда будет операцией, пропорциональной количеству файлов / каталогов, которые он содержит? Когда происходит, когда я отменяю связь родительского каталога с другими каталогами / файлами? Это никогда не будет уничтожено, и я потерял это место навсегда?
Марчин
6
Технически возможно оставить потерянные каталоги / файлы в большинстве, если не во всех файловых системах. Исправление этого обычно означает запуск инструмента восстановления файловой системы. В Unix / Linux эти инструменты известны как 'fsck' и некоторые специфические варианты для разных файловых систем. Если они действительно что-то восстанавливают, они обычно оставляют это в каталоге с именем lost + found
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 unlink: невозможно отсоединить `1 ': пользователи каталога вызывают утечку памяти, требующую использования fsck? Навряд ли!
Томас
1
Как Linux, так и FreeBSD manpages явно заявляют, что произойдет сбой при попытке запустить unlink () в каталоге.
Томас
8

На уровне спецификации POSIX то, что делает rm , задается гораздо более точно, чем то, что делает unlink .

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

Майк Г.
источник
4

Медленная часть удаления связана с кодом файловой системы и дисками, а не с подготовкой пользовательского пространства системным вызовом unlink ().

То есть: если разница в скорости имеет значение, то вам не следует хранить данные в файловой системе.

unlink это просто rm "light". У rm больше возможностей, но они делают то же самое.

Томас
источник