6

我尝试使用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*

截图

在我的拙见中,它也应该在使用星号时找到,但事实并非如此。

有什么问题?

4

1 回答 1

12

来自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*"

应该按您的意愿工作:找到具有基本名称匹配的文件(在正则表达式中):^rhyth.*

希望这可以帮助。

编辑。回答您的评论:如果您想要文件夹中的locate所有jpg文件/home/sh/music/,应该这样做:

locate '/home/sh/music/*.jpg'

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

locate -i '/home/sh/music/*.jpg'

编辑 2.最好在某处说:该locate命令适用于数据库——这就是为什么它可以比find. 如果你有最近的文件,它们不会是located,如果你删除了一些文件,它们可能仍然是located。如果您在这种情况下(这可能是您的其他评论的目的),您必须更新locate's database: as root,发出:

updatedb

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

于 2013-06-23T16:47:01.133 回答