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


Отключается ли скорость быстрее rm?


58
2017-07-10 08:49


Источник


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


Ответы:


Оба являются оберткой для той же основной функции, которая является 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), Семантика по-прежнему будет отличаться между платформой.


61
2017-07-10 08:58



Означает ли это, что в unix-файловых системах удаление каталога и рекурсивно все файлы под ним всегда будут операцией, которая пропорциональна количеству файлов / dirs, которые она содержит? Когда происходит, когда я отсоединяю директорию, которая является родительской для других dirs / files? Он никогда не уничтожается, и я потерял это пространство навсегда? - Marcin
Технически возможно оставить осиротые каталоги / файлы на большинстве, если не на всех файловых системах. Исправление этого обычно означает запуск средства восстановления файловой системы. В Unix / Linux эти инструменты известны как «fsck» и некоторые специфические варианты для разных файловых систем. Если они что-то возвращают, они обычно оставляют его в директории с именем «lost + found» - ConcernedOfTunbridgeWells
Верный. rm будет возвращаться со дна дерева вверх. Вы можете продемонстрировать, как с помощью: mkdir -p 1/2/3; touch 1/one 1/2/two 1/2/3/three; rm -ri 1, Если вы отсоединили родительский каталог, тогда пространство, потребляемое детьми, должно быть потеряно до тех пор, пока fsck не обнаружит несоответствие. - Dan Carley
О чем ты говоришь? $ mkdir -p 1/2/3 $ unlink 1 unlink: невозможно отменить связь `1 ': есть ли каталог, вызывающий утечку памяти, требующей fsck? Вряд ли! - Thomas
В файлах Linux и FreeBSD явно указано, что при попытке запустить unlink () в каталоге он будет терпеть неудачу. - Thomas


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

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


6
2017-07-10 12:44





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

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

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


4
2017-07-10 11:46