FreeBSD 9: Как найти точное имя файла?

10

Попытка использовать locateкоманду, чтобы найти точное соответствие для данного шаблона. Однако в результате отображаются все подходящие файлы.

Например: я хочу найти двоичный файл с именем: узел

Но это дает мне все совпадения, содержащие это слово:

server2# locate node
/usr/share/man/man9/getnewvnode.9.gz
/usr/share/man/man9/ieee80211_amrr_node_init.9.gz
/usr/share/man/man9/ieee80211_dump_node.9.gz
/usr/share/man/man9/ieee80211_dump_nodes.9.gz
/usr/share/man/man9/ieee80211_find_rxnode.9.gz
/usr/share/man/man9/ieee80211_find_rxnode_withkey.9.gz
/usr/share/man/man9/ieee80211_free_node.9.gz
Алекс Г
источник

Ответы:

10

Если вы посмотрите на locate --help, вы можете найти:

  -r, --regexp REGEXP    search for basic regexp REGEXP instead of patterns
      --regex            patterns are extended regexps

Вы можете использовать, -rчтобы предоставить шаблон регулярного выражения для locate:

locate -r /node$

В /Гарантирует nodeнаходится в начале имени файла. В $Гарантирует nodeнаходится в конце имени файла. Это даст вам только файлы, соответствующие точному имени файла.

Если вы хотите сделать поиск без учета регистра (спички Node, NODE, nOdEи т.д.), добавьте -i:

locate -i -r /node$

Если locate не поддерживает регулярные выражения, вы можете использовать grep (как упомянуто Iracicot):

locate node | grep /node$
locate -i node | grep -i /node$
ADTC
источник
В качестве альтернативы, вы можете использовать -bпереключатель только для совпадения с locate -br node$
Sarke
6

Вы можете использовать grep с locate

server2# locate node | grep node$

Знак $ скажет grep посмотреть конец строки.

lracicot
источник
1
Результат тот же. Он вызывает различные совпадения, заканчивающиеся на узле ... / usr / ports / www / p5-WebService-Linode. Я думаю, это должен быть / узел $?
Alex G
Да, вы тоже можете попробовать это (но я не уверен, должен ли экранироваться символ / или нет). Вы пытались найти -b?
Лерасикот
0

Отключите locateнеявный glob, добавив свой собственный glob, который соответствует всем каталогам:

locate */node

Со страницы руководства:

Если какой-либо из них не PATTERNсодержит символы-заглушки, locate ведет себя так, как если бы*PATTERN*

Этот синтаксис будет соответствовать полному имени файла или каталога в любом месте, в том числе в корневом каталоге.

Роджер Даль
источник