我尝试使用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*
在我看来,它应该找到使用星号的时候,但事实并非如此。
有什么不对?
答案 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
可能需要几分钟才能完成,请不要担心。