«Преждевременная оптимизация - корень всего зла (или, по крайней мере, большей его части) в программировании». - Дональд Кнут 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, если ваш скрипт должен работать в ОС.
Ответы:
Оба являются оберткой для одной и той же фундаментальной функции, которая является
unlink()
системным вызовом.Чтобы взвесить различия между пользовательскими утилитами.
rm(1)
:unlink(1)
:rm(1)
нескольких аргументов.Вы можете продемонстрировать разницу с:
Однако, если мы говорим о незапятнанном вызове системной
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 , задается гораздо более точно, чем то, что делает unlink .
Переносимость результата, вероятно, будет лучше при использовании rm, если ваш скрипт должен работать в ОС.
источник
Медленная часть удаления связана с кодом файловой системы и дисками, а не с подготовкой пользовательского пространства системным вызовом unlink ().
То есть: если разница в скорости имеет значение, то вам не следует хранить данные в файловой системе.
unlink это просто rm "light". У rm больше возможностей, но они делают то же самое.
источник