Вступление
Есть пять команд поиска файлов на Linux: whereis, locate, which, type, и find. Каждый из них имеет свои особенности и предназначен для определенных поисковых сценариев. Это руководство познакомит вас с каждой командой и покажет примеры использования. Для дальнейшего чтения любой из этих команд лучше всего просмотреть соответствующую страницу руководства.
whereis
Команда whereisиспользуется для поиска двоичных файлов, исходного кода и онлайн-страниц справочника в нескольких стандартных каталогах установки для любого указанного имени программы.
Поскольку whereisне выполняется поиск в каждом месте вашей системы, любые файлы из этих конкретных каталогов не будут найдены. По той же причине вы быстро получите результаты поиска, независимо от того, найдены они или нет.
Кроме того, он не будет искать те команды, которые встроены непосредственно в оболочку.
Например, если вы хотите найти информацию о lsкоманде, выполните следующую команду на своем терминале:
whereis ls
Вы получите некоторые отзывы, такие как:
ls: /bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
В результате, /bin/lsэто бинарный файл, который вы хотите найти, два других - man-страницы для lsпрограммы, исходный код для lsпрограммы не найден.
Скопируйте /bin/lsфайл в свой домашний каталог и в /usr/binкаталог, а затем whereisснова введите команду:
cp /bin/ls ~
cp /bin/ls /usr/bin/ls
whereis ls
Как видите, только /bin/lsи /usr/bin/lsбыли найдены в результате поиска. lsПрограмма в домашнем каталоге не найден, потому что ваш домашний каталог не один из тех , стандартной установки каталогов.
ls: /bin/ls /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
Если вы запустите следующую команду:
whereis cd
Вы увидите вывод, похожий на строку ниже. Не было обнаружено двоичного файла, потому что cdэто встроенная команда оболочки.
cd: /usr/share/man/man1/cd.1.gz /usr/share/man/man1p/cd.1p.gz
locate
Команда locateиспользуется для поиска файлов по имени с помощью базы данных ( /var/lib/mlocate/mlocate.db). Эта база данных является в основном снимком структуры вашей файловой системы. Любые записи в этой базе данных, которые соответствуют вашему запросу, будут перечислены в результатах поиска. По умолчанию locateкоманда будет использовать ваш запрос для сопоставления любой части полного имени каждой записи, включая имя пути. Следовательно, количество найденных файлов в результате поиска может оказаться больше, чем вы ожидаете.
Поскольку база данных устаревает, результат поиска locateкоманды становится менее точным. Вы можете заметить файлы, которые больше не существуют, или вы не увидите совпадений для вновь созданных файлов. По умолчанию mlocate.dbбаза данных автоматически обновляется один раз в день. Вы можете использовать updatedbкоманду, чтобы обновить ее вручную.
Поскольку поиск выполняется по базе данных, а не по файловой системе, скорость поиска очень высокая.
Если вы запустите следующую команду:
locate ls
Вы получите много записей вместо ожидаемого результата.
Чтобы сделать результаты поиска более точными, вы можете использовать -bфлаг, чтобы ограничить диапазон поиска, используя свой запрос, чтобы соответствовать только базовому имени каждой записи:
locate -b "\ls"
На этот раз вы получите местоположение каждого файла, точно вызванного lsв вашей файловой системе:
/bin/ls
which
Команда whichбудет искать команду, указанную вами в значении переменной среды, PATHи по умолчанию выдаст первый результат. Если вы запрашиваете псевдоним, whichкоманда определит фактическую команду для псевдонима перед выполнением поиска.
Команда whichтакже очень быстрая из-за своей простоты.
Использование whichкоманды просто:
which your_command
Если вы хотите показать все совпавшие команды вместо первой, используйте -aфлаг:
which -a your_command
Вот пример для поиска команды, которая была псевдонимом:
which ll
Результат поиска будет:
alias ll='ls -l --color=auto'
/bin/ls
type
По умолчанию typeкоманда указывает, как будет интерпретироваться имя команды. Возможные результаты включают псевдоним, ключевое слово, функцию, встроенную функцию или файл. Как и whereisкоманда, typeкоманда будет искать только в нескольких стандартных каталогах установки, чтобы ответить на ваш запрос.
Несколько примеров ввода разных команд:
Встроенная команда оболочки:
type cd
cd is a shell builtin
Бинарный файл в файловой системе:
type sudo
sudo is /usr/bin/sudo
Псевдоним:
type ls
ls is aliased to `ls --color=auto'
find
Среди пяти команд поиска файлов, представленных в этом руководстве, эта findкоманда является самой мощной. Это также самый медленный. В отличие от других четырех команд, findкоманда фактически будет искать ваш файл во всей файловой системе, один i-узел за одним i-узлом. С помощью findкоманды вы можете использовать сложные критерии запроса, чтобы найти каждый файл, который вам нужен, даже дополнительно выполнить действия с найденными файлами.
Критерии поиска для findкоманды слишком сложны, чтобы их можно было объяснить в такой короткой статье, а здесь несколько примеров.
Базовый формат findкоманды:
find [path] [option] [action]
Чтобы найти все файлы в рабочем каталоге и всех его подкаталогах:
find
Чтобы найти файл с именем aaaв вашем домашнем каталоге и во всех его подкаталогах:
find ~ -name 'aaa'
Чтобы найти все файлы в файловой системе, которые были изменены за последние 24 часа:
find / -mtime 0
Чтобы найти все файлы в веб-каталоге и все его подкаталоги, принадлежащие пользователю nginx:
find /usr/share/nginx/html/ -user nginx
Чтобы найти все файлы в рабочем каталоге с правами доступа 0744:
find -perm -0744
Чтобы найти файл с именем aaaв рабочем каталоге и вывести его подробную информацию:
find -name 'aaa' -exec ls -l {} \;