带有模式的 bash 定位命令

标签 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*

( 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/

相关文章:

JSON 和 Cygwin - 如何解析、获取字段等

bash - 将整个提交复制到单独的目录中

c - 在c中定位数组中的颜色

C# 需要使用 REGEX 定位网址吗?

mysql - 使用 LOCATE 和 SUBSTRING 从 MySQL 返回特定文本

selenium - 何时以及如何使用Selenium Webdriver通过Tagname定位元素?请举例说明

mysql - 仅从 mySQL 中的特定字符的左侧和右侧获取字符

mysql - bash shell mysql 命令从命令行运行,但不在脚本内运行

linux - 循环读取 bash 文件中的多个查询

bash - 通过gnome-terminal打开终端然后执行命令,错误: "failed to execute child process""