2013-06-23 2 views
4

Я пытаюсь найти файл с командой locate.bash locate command with pattern

Он ведет себя странно с узорами, по крайней мере, не такими, как ls или find команд.

я сделать следующее:

[email protected]:~$ locate rhythmdb 
/home/sh/.local/share/rhythmbox/rhythmdb.xml 
[email protected]:~$ locate "rhyth*" 
[email protected]:~$ locate 'rhyth*' 
[email protected]:~$ locate rhyth* 

(Screenshot)

По моему скромному мнению, он должен найти, когда используется звездочка тоже, но это не так.

Что может быть неправильным?

ответ

8

От man locate:

If --regex is not specified, PATTERNs can contain globbing characters. If any 
PATTERN contains no globbing characters, locate behaves as if the pattern 
were \*PATTERN*. 

Таким образом, когда вы выдаете

locate rhyth* 

locate не найти его, потому что нет никаких файлов, которые соответствуют этому шаблону: поскольку есть Глоб характер, найти волю действительно пытайтесь сопоставить (в regex): ^rhyth.* и, очевидно, нет таких совпадений (по полным путям).

В вашем случае, вы можете попробовать:

locate "/home/sh/.local/share/rhythmbox/rhyth*" 

или

locate '/rhyth' # equivalent to locate '*/rhyth*' 

Но это не очень хорошо, не так ли?

Теперь рассмотрим первый вариант в man locate:

-b, --basename 
      Match only the base name against the specified patterns. This 
      is the opposite of --wholename. 

Ура! линия:

locate -b "rhyth*" 

должен работать, как вы хотите, чтобы: найти файл с соответствия базовому (в регулярном выражении): ^rhyth.*

Надеется, что это помогает.

Редактировать. Чтобы ответить на комментарий: если вы хотите locate все JPG файлы в папке /home/sh/music/, это должно сделать:

locate '/home/sh/music/*.jpg' 

(не -b здесь, он не будет работать). Обратите внимание, что это отобразит все файлы jpg, которые находятся в папке /home/sh/music, а также в подпапках. Вы могли бы возникнуть соблазн использовать -i флаг (игнорировать регистр), так что вы будете также найти те, которые имеют прописную JPG расширение:

locate -i '/home/sh/music/*.jpg' 

Edit 2. Лучше сказать это где-то: команда locate работает с базой данных —, поэтому она может быть намного быстрее, чем find. Если у вас есть последние файлы, они не будут locate d, и если вы удалите некоторые файлы, они все равно могут быть locate d. Если вы в этом случае (который может быть целью вашего другого комментария), то необходимо обновить базу данных locate «s: как корень, вопрос:

updatedb 

Предупреждения. Команда updatedb может потребоваться несколько минут, чтобы не путать.

+0

Ненавижу задавать еще один глупый вопрос, но можно ли указать определенное местоположение? например Я попытался сделать: locate -b "/home/sh/music/*.jpg", но он, похоже, не работает – Tebe

+0

@gekannt В этом случае вам не нужен флаг '-b'. –

+0

ОК, я пробовал, что не работает, если найду. * .jpg, я получаю много файлов, если я найду - ничего. https://dl.dropboxusercontent.com/u/18776391/storage/21%3A22%3A1323062013_001.png https://dl.dropboxusercontent.com/u/18776391/storage/21%3A25%3A5723062013_001.png https: // dl.dropboxusercontent.com/u/18776391/storage/21%3A28%3A3423062013_001.png – Tebe