locate(1)
имеет только одно большое преимущество find(1)
: скорость.
find(1)
, Тем не менее, имеет много преимуществ locate(1)
:
find(1)
является исконным, возвращаясь к самой первой версии Unix AT&T. Вы даже найдете, что это в сокращении встроило Linux через Busybox. Это почти универсально.
locate(1)
намного моложе, чем find(1)
. Самый ранний предок locate(1)
не появлялся до 1983, и это не было широко доступно как"locate
"до 1994, когда это было принято в GNU findutils и в 4.4BSD.
locate(1)
также нестандартно, таким образом это не установлено по умолчанию везде. Некоторые Ose типа POSIX даже не предлагают его как опцию, и где это доступно, реализация может испытывать недостаток в функциях, которые Вы хотите, потому что нет никакого независимого стандарта, указывающего минимальный набор функций, который должен быть доступным.
Существует фактический стандарт, будучи BSD locate(1)
, но это то, только потому, что другие две основных разновидности locate
реализуйте все его опции: -0
, -c
, -d
, -i
, -l
, -m
, -s
, и -S
. mlocate
реализации 6 дополнительных опций не в BSD locate
: -b
, -e
, -P
, -q
, --regex
и -w
. GNU locate
реализации те шесть плюс еще четыре: -A
, -D
, -E
, и -p
. (Я игнорирую псевдонимы и незначительные различия как -?
по сравнению с -h
по сравнению с --help
.)
BSDs и Mac OS X поставляют BSD locate
.
Большинство Linux поставляет GNU locate
, но Red Hat Linux и поставка Arch mlocate
вместо этого. Debian не устанавливает ни одного в своей основной установке, но предлагает обе версии в его хранилищах пакетов по умолчанию; если оба установлены сразу,"locate
"выполнения mlocate
.
Oracle поставлялась mlocate
в Солярисе с тех пор 11.2, выпущенный в декабре 2014. До этого, locate
не был установлен по умолчанию на Солярисе. (По-видимому, это было сделано для сокращения несовместимости команды Solaris с Oracle Linux, который основан на Red Hat Enterprise Linux, который также использует mlocate
.)
IBM AIX все еще не поставляет версии locate
, по крайней мере, с AIX 7.2, если Вы не устанавливаете GNU findutils
от панели инструментов AIX для приложений Linux.
HP-UX также, кажется, недостает locate
в основной системе.
Более старый "реальный" Unixes обычно не включал реализацию locate
.
find(1)
имеет мощный синтаксис выражения, со многими функциями, булевыми операторами, и т.д.
find(1)
может выбрать файлы больше, чем просто именем. Это может выбрать:
При нахождении файлов по имени, можно искать файл использования globbing синтаксис во всех версиях find(1)
, или в GNU или версиях BSD, с помощью регулярных выражений.
Текущие версии locate(1)
примите шаблоны шарика как find
делает, но BSD locate
не делает regexes вообще. Если Вы похожи на меня и должны использовать множество типов машины, Вы предпочитаете grep
фильтрация к разработке зависимости от -r
или --regex
.
locate
нуждается в сильной фильтрации больше, чем find
делает потому что...
find(1)
не обязательно ищет всю файловую систему. Вы обычно указываете на него на подкаталог, родитель, содержащий все файлы, на которые Вы хотите, чтобы это воздействовало. Типичное поведение для a locate(1)
реализация должна извергнуть все файлы, соответствующие Вашему шаблону, оставив это grep
фильтрация и такой для сокращения его извержения к размеру.
(Злая подсказка: locate /
вероятно, получит Вас список всех файлов в системе!)
Существуют варианты locate(1)
как slocate(1)
которые ограничивают вывод на основе полномочий пользователя, но это не версия по умолчанию locate
в любой главной операционной системе.
find(1)
может сделать вещи в файлы, которые это находит, в дополнение только к нахождению их. Самое мощное и широко поддерживаемый такой оператор -exec
, но существуют другие. В недавнем GNU и BSD находят реализации, например, Вы имеете -delete
и -execdir
операторы.
find(1)
выполнения в режиме реального времени, таким образом, его вывод всегда актуален.
Поскольку locate(1)
полагается на обновленные часы или дни базы данных в прошлом, ее вывод может устареть. (Это - устаревшая проблема кэша.) Эта монета имеет две стороны:
locate
может назвать файлы, которые больше не существуют.
GNU locate
и mlocate
имейте -e
флаг, чтобы заставить его проверить на существование файла перед распечатыванием названия каждого файла, который это обнаружило в прошлом, но это съедает часть из locate
преимущество скорости, и не доступно в BSD locate
кроме того.
locate
не назовет файлы, которые были созданы начиная с последнего обновления базы данных.
Вы учитесь быть несколько подозрительными к locate
вывод, зная это может быть неправильным.
Существуют способы решить эту проблему, но я не знаю ни о какой реализации в широком использовании. Например, существует rlocate
, но это, кажется, не работает против любого современного ядра Linux.
find(1)
никогда не имеет больше полномочие, чем пользователь, выполняющий его.
Поскольку locate
предоставляет глобальную услугу всем пользователям в системе, она хочет иметь updatedb
процесс выполняется как root
таким образом, это видит всю файловую систему. Это приводит к выбору проблем безопасности:
Выполненный updatedb
как корень, но делают его выходной файл читаемым миром так locate
может работать без специальных полномочий. Это эффективно выставляет названия всех файлов в системе всем пользователям. Это может быть действительно нарушением защиты для порождения настоящей проблемы.
BSD locate
настроен этот путь на Mac OS X и FreeBSD.
Запишите базу данных как читаемую только root
, и сделайте locate
setuid
базируйтесь, таким образом, это может считать базу данных. Это означает locate
эффективно должен повторно реализовать систему разрешения ОС, таким образом, она не показывает Вам файлы, которые Вы не можете обычно видеть. Это также увеличивает поверхность атаки Вашей системы, конкретно рискуя корневым нападением эскалации.
Создайте специальное предложение"locate
"пользователь или группа, чтобы владеть файлом базы данных и отметить locate
двоичный файл как setuid/setgid
для того пользователя/группы, таким образом, это может считать базу данных. Это не предотвращает нападения расширения полномочий отдельно, но это значительно смягчает ущерб, который можно было нанести.
mlocate
настроен этот путь на Red Hat Enterprise Linux.
У Вас все еще есть проблема, тем не менее, потому что, если можно использовать отладчик на locate
или заставьте это выводить ядро, можно достигнуть привилегированные части базы данных.
Я не вижу способ создать действительно "безопасное" locate
команда, за исключением выполнения его отдельно для каждого пользователя в системе, которая инвертирует большую часть ее преимущества find(1)
.
Нижняя строка, оба очень полезны. locate(1)
лучше, когда Вы просто пытаетесь найти конкретный файл по имени, который Вы знаете, существует, но Вы просто не помните, где это точно. find(1)
лучше, когда у Вас есть сфокусированная область для исследования, или когда Вам нужно любое из ее многих преимуществ.
Вам нужно -s
связывать фактические строки вместо виджетов:
bindkey -s jj '\e'
Хотя Вы, вероятно, хотите отобразиться jj
к vi-cmd-mode
виджет здесь:
bindkey jj vi-cmd-mode
(обратите внимание, что это для привязки в режиме вставки, не нормального / командного режима),
KEYTIMEOUT
кажется, повреждает привязку клавиш. – Alexej Magura 27.12.2013, 21:28