我试图用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*
Run Code Online (Sandbox Code Playgroud)
(截图)
在我的拙见中,它应该找到使用星号的时候,但事实并非如此.
有什么不对?
gni*_*urf 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*.
Run Code Online (Sandbox Code Playgroud)
因此,当你发出
locate rhyth*
Run Code Online (Sandbox Code Playgroud)
locate找不到它,因为没有匹配这个模式的文件:因为有一个glob字符,locate会真正尝试匹配(在正则表达式中):^rhyth.*并且显然没有这样的匹配(在完整路径上).
在您的情况下,您可以尝试:
locate "/home/sh/.local/share/rhythmbox/rhyth*"
Run Code Online (Sandbox Code Playgroud)
要么
locate '/rhyth' # equivalent to locate '*/rhyth*'
Run Code Online (Sandbox Code Playgroud)
但那不是很好,是吗?
现在,看看第一个选项man locate:
-b, --basename
Match only the base name against the specified patterns. This
is the opposite of --wholename.
Run Code Online (Sandbox Code Playgroud)
欢呼!这条线:
locate -b "rhyth*"
Run Code Online (Sandbox Code Playgroud)
应该按你的意愿工作:找到一个基本名称匹配的文件(在正则表达式中):^rhyth.*
希望这可以帮助.
编辑.回答你的评论:如果你想要文件夹中的locate所有jpg文件/home/sh/music/,这应该做:
locate '/home/sh/music/*.jpg'
Run Code Online (Sandbox Code Playgroud)
(不,-b这里不行).请注意,这会显示所有JPG是在文件夹中的文件/home/sh/music ,并在其子文件夹.你可能会想要使用-i标志(忽略大小写),这样你也可以找到那些具有大写JPG扩展名的标志:
locate -i '/home/sh/music/*.jpg'
Run Code Online (Sandbox Code Playgroud)
编辑2.最好在某处说:该locate命令适用于数据库 - 这就是为什么它可以比它快得多find.如果您有最近的文件,它们将不会是located,如果您删除了一些文件,它们可能仍然是located.如果你是这种情况(可能是你的其他评论的目的),你必须更新locate的数据库:以root身份,发出:
updatedb
Run Code Online (Sandbox Code Playgroud)
警告.该命令updatedb可能需要几分钟才能完成,不用担心.