我尝试使用 locate
命令查找文件。
它在模式方面表现得有些奇怪,至少不像 ls
或 find
命令。
我做了以下事情:
sh@sh:~$ locate rhythmdb
/home/sh/.local/share/rhythmbox/rhythmdb.xml
sh@sh:~$ locate "rhyth*"
sh@sh:~$ locate 'rhyth*'
sh@sh:~$ locate rhyth*
( Screenshot )
以我的愚见,它应该在也使用星号时找到,但它没有。
有什么问题吗?
最佳答案
来自 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.*
希望这对您有所帮助。
编辑。回答您的评论:如果您想找到
文件夹/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
快得多的原因.如果您有最近的文件,它们将不会被定位
d,如果您删除了一些文件,它们可能仍会被定位
d。如果您处于这种情况(这可能是您其他评论的目的),您必须更新locate
的数据库:作为 root,问题:
updatedb
警告。updatedb
命令可能需要几分钟才能完成,请不要担心。
关于带有模式的 bash 定位命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17262827/