bash locate with pattern with pattern

Teb*_*ebe 5 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*
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可能需要几分钟才能完成,不用担心.