首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pattern的bash locate命令

使用pattern的bash locate命令
EN

Stack Overflow用户
提问于 2013-06-24 00:27:47
回答 1查看 10.8K关注 0票数 6

我尝试使用locate命令查找文件。

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

我执行以下操作:

代码语言:javascript
复制
sh@sh:~$ locate rhythmdb
/home/sh/.local/share/rhythmbox/rhythmdb.xml
sh@sh:~$ locate "rhyth*"
sh@sh:~$ locate 'rhyth*'
sh@sh:~$ locate rhyth*

(Screenshot)

在我的愚见中,它也应该发现什么时候使用了星号,但它没有。

会出什么问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-24 00:47:01

来自man locate

代码语言:javascript
复制
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*.

因此,当您发出

代码语言:javascript
复制
locate rhyth*

locate将找不到它,因为没有与此模式匹配的文件:由于有一个全局字符,locate将真正尝试匹配(在正则表达式中):^rhyth.*,但显然没有这样的匹配(在完整路径上)。

在您的情况下,您可以尝试:

代码语言:javascript
复制
locate "/home/sh/.local/share/rhythmbox/rhyth*"

代码语言:javascript
复制
locate '/rhyth' # equivalent to locate '*/rhyth*'

但这并不是很好,不是吗?

现在,看看man locate中的第一个选项

代码语言:javascript
复制
   -b, --basename
          Match  only  the base name against the specified patterns.  This
          is the opposite of --wholename.

万岁!这行代码:

代码语言:javascript
复制
locate -b "rhyth*"

应该可以像您希望的那样工作:找到一个基本名称匹配的文件(在正则表达式中):^rhyth.*

希望这能有所帮助。

编辑。回答你的意见:如果你想在文件夹/home/sh/music/中编辑所有的jpg文件,这应该是这样做的:

代码语言:javascript
复制
locate '/home/sh/music/*.jpg'

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

代码语言:javascript
复制
locate -i '/home/sh/music/*.jpg'

编辑2.更好的说法是:locate命令与数据库一起工作--这就是为什么它比find快得多。如果你有最近的文件,它们将不是located,如果你删除了一些文件,它们可能仍然是located。如果你在这种情况下(这可能是你其他评论的目的),你必须更新locate的数据库:以根用户身份,发出:

代码语言:javascript
复制
updatedb

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17262827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档