bash locate with pattern with pattern

时间:2013-06-23 16:27:47

标签: bash locate

我尝试使用locate命令找到一个文件。

它在模式方面表现得有些奇怪,至少不像lsfind命令。

我执行以下操作:

sh@sh:~$ locate rhythmdb
/home/sh/.local/share/rhythmbox/rhythmdb.xml
sh@sh:~$ locate "rhyth*"
sh@sh:~$ locate 'rhyth*'
sh@sh:~$ locate rhyth*

Screenshot

在我看来,它应该找到使用星号的时候,但事实并非如此。

有什么不对?

1 个答案:

答案 0 :(得分:10)

来自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找不到它,因为没有匹配此模式的文件:因为有一个glob字符,locate会真正尝试匹配(在正则表达式中):^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*"

应该按照您的意愿工作:找到 basename 匹配的文件(在正则表达式中):^rhyth.*

希望这有帮助。

修改。要回答您的评论:如果您想locate文件夹/home/sh/music/中的所有 jpg 文件,则应执行以下操作:

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

(这里没有-b,它不起作用)。请注意,这将显示文件夹/home/sh/music 中的所有 jpg 文件以及其子文件夹中的。你可能想要使用-i标志(忽略大小写),这样你找到那些具有大写 JPG 扩展名的标志:

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

编辑2。最好在某处说:locate命令适用于数据库 - 这就是为什么它比find快得多。如果您有最近的文件,则它们不会是locate d,如果您删除了某些文件,它们可能仍然是locate d。如果你是这种情况(可能是你的其他评论的目的),你必须以root身份更新locate的数据库: ,发出:

updatedb

警告。命令updatedb可能需要几分钟才能完成,请不要担心。