В чем разница между местонахождением / где / какой

13

Какова основная разница между locate whereisи whichкомандой.

Основное различие, которое я заметил, заключается в том, что locateвсе связанные имена файлов находятся во всей файловой системе, а команды whereisи whichдают только местоположение (системный / локальный адрес файла) установленного приложения. Насколько точны мои наблюдения?

Как эти команды реализованы внутри? Почему locateработает так быстро по сравнению с поиском по тире, в то время как locateприходится искать конкретное имя файла, соответствующее целевой строке во всей иерархии файловой системы?

Чинмая Б
источник
2
а как насчет type? : P
jamesmstone
@jamesmstone Что ты имеешь в виду type, пожалуйста, уточни
Chinmaya B
2
Извините, я просто пытался добавить на ваш вопрос. typeэто еще одна команда, которая (на мой взгляд) делает то же самое, что и упомянутые вами.
Джеймсстон
@jamesmstone Я не думаю, что есть какая-либо команда типа, которая работает в моей системе. Я не могу найти руководство или информационную страницу для typeкоманды. Я попробовал man typeи info type.
Чинмайя Б
Хм, интересно, почему ... Вы используете Bash?
Джеймсстон

Ответы:

17

whichнаходит двоичный исполняемый файл программы (если он находится в вашей переменной PATH). man whichобъясняет более четко:

который возвращает пути к файлам (или ссылкам), которые будут выполняться в текущей среде, если его аргументы были заданы как команды в строго POSIX-совместимой оболочке. Это делается путем поиска в PATH исполняемых файлов, соответствующих именам аргументов. Он не следует по символическим ссылкам.

whereisнаходит двоичный файл, исходный код и файлы справочной страницы для программы. Например

$ whereis gimp
/usr/bin/gimp /usr/lib/gimp /etc/gimp /usr/share/gimp /usr/share/man/man1/gimp.1.gz

Вы можете получить дополнительную информацию, передавая выходные данные этих команд в качестве аргументов ls -lилиfile

$ ls -l $(which gimp)
lrwxrwxrwx 1 root root 8 Jun 30 19:59 /usr/bin/gimp -> gimp-2.8

$ file $(which gimp)
/usr/bin/gimp: symbolic link to gimp-2.8

locateдействительно находит все файлы с шаблоном, указанным в любом месте их пути. Вы можете указать это только для поиска файлов и каталогов, чьи имена (а не полные пути) включают шаблон с -bпараметром, который обычно является тем, что вам нужно, и дает менее громоздкий список.

locateработает быстро, потому что использует двоичную базу данных, которая периодически обновляется (один раз в день cron). Вы можете обновить его самостоятельно, чтобы убедиться, что недавно добавленные файлы найдены, запустивsudo updatedb

Еще одна вещь locate- это не волнует, существуют ли файлы или нет, поэтому, чтобы избежать поиска недавно удаленных файлов, используйте -e. Часто я также труба к lessкак список может быть длинным. Обычно я делаю:

sudo updatedb && locate -b -e gimp | less

Как пунктирные работы Юнити объясняется здесь - он использует Zeitgeist системных файлов индекса и узнать от модели использования, и позволяет другим приложениям использовать эти данные, так что это делает намного больше работы , чем locate.

Занна
источник
Можете ли вы сравнить тире и найти производительность команды и детали реализации? Обновление двоичной базы данных должно быть сделано после создания любого нового файла в системе, не так ли, что период будет неопределенно правильным или это управляется системными процессами?
Чинмайя Б
2
@Creator автоматически обновляет базу данных cron, один раз в день. Вы можете проверить, когда устанавливаете что-то, с чем вы не можете сразу найти файлы locate. Черта использует совершенно другой индекс - медленнее, потому что он делает больше вещей (я отредактировал мой ответ)
Zanna
1
Таким образом, подведение итогов locate полезно и более мощно, чем то, что или где, но глупо, в то время как тире более мощно и реализует машинное обучение. и спасибо за sudo updatedbвашу команду очень полезно, не знал, что, хотя я использовал -e регулярно.
Чинмая Б
@ Творец, да, ты сформулировал это лучше :) рад, что это помогло
Zanna
0

Просто

$ which samba

какая команда ищет список программ, перечисленных в настройках PATH

$ whereis samba

Команда whereis также ищет программы, которых нет в настройке PATH

$locate samba

Также находит файлы по имени файла, но не ищет саму структуру каталогов, а только базу данных, подготовленную updatedb. Из-за этого найти быстрее, чем найти, но менее точно. Примеры:

NullPointer
источник