正则表达式匹配“ locate”


8

我正在尝试使用locate命令在主文件夹中查找文件,但是,每当尝试运行此文件时,都不会得到任何结果:

locate -i -l 4 --regexp '^\/home\/jack\/[A-Za-z0-9\/\ ]*(My.)*$'

我也尝试过,^\/home\/jack\/^(?!\.)[A-Za-z0-9\/\ ]*(My.)*$但是也不会返回任何结果。

我要测试的文件是 /home/jack/Music/Foals/My Number.flac

我想从搜索中排除隐藏文件的结果。


2
我不熟悉locate。结合-b(即“仅将基本名称与指定的模式进行匹配”。)和in中的路径是否有意义--regexp?为什么要逃避/S?
Hauke Laging

抱歉,我使用的是正则表达式生成器,建议我转义那些字符,而我猜你对-b标志是正确的,我现在将其删除
Jack Jones

1
什么是(My.)*应该做的?My.*$作品。您必须逃脱()基本RE。
Hauke Laging

1
您正在使用扩展的正则表达式。但是--regexp需要一个基本的正则表达式。尝试更改--regexp--regex(no p)。手册页说--regex确实进行了正则表达式匹配。
Mikel

Answers:


6

这似乎可以完成工作。

locate -ir '^/home/jack/\([^.][^/]\+/\)\+My[^/]*$'

手册引用:

-i,--ignore-case匹配模式时忽略大小写区别。

-r,-regexp REGEXP搜索基本的regexp REGEXP。如果使用此选项,则不允许使用PATTERN。但是可以多次指定此选项。


在Linux下,mlocate 0.26-1ubuntu2(Ubuntu 16.04 LTS Xenial Xerus,从2018-02-05开始),该命令返回以下错误“ locate:--regexp不允许使用非选项参数”。mlocate是实际的软件包(/ usr / bin / locate是mlocate的符号链接)。
汉斯·德拉贡

1

定位如何工作

locate命令使用的文件索引通常每天仅重建一次。它是由此Cron工作建立的/etc/cron.daily/mlocate。因此,您的条目可能还不存在。如果您希望它手动重建这些索引,则可以重新运行它。

$ sudo /etc/cron.daily/mlocate

使用查找

但是,最好使用诸如find在主目录中找到文件的命令。

$ find ~ -iname "[^.]*" | head -10
/home/saml
/home/saml/isql_issue.txt
/home/saml/bbbb
/home/saml/script_name.sh
/home/saml/go_figure_book
/home/saml/go_figure_book/readme.txt
/home/saml/go_figure_book/lstopo.txt
/home/saml/go_figure_book/who_breaks_out.bash
/home/saml/hdat2
/home/saml/hdat2/hdat2_v50.iso

使用GUI

您可能也对图形搜索工具感兴趣。查看标题为GTK Frontend for find的其他U&L问答,其中涵盖了一种称为Catfish的工具。该工具也可以利用locate数据和find命令。


1
我经常发现locatefind我必须先做的要快updatedb。只要大多数系统上的数据库已经相当合理地更新,updatedb就不会花费很长时间。在这种情况下,查找语法可能会更容易。
Graeme 2014年

是的,我也每天都使用它,它仅在我编写经常切换到的脚本的服务器上使用find
slm

是的,应该放置“大多数桌面系统”
Graeme 2014年

1

您还可以采用其他方法:

locate "My file" | grep '/home/jack' | grep -v '/\.'

我不确定您要做什么。您正在使用的-i标志,使其不区分大小写,你的正则表达式是不是很具体,你似乎顶想找到有下的所有文件或文件夹/home/jack,并包含MYMymy,或mY在文件名中的任何地方。如果是这样,请运行

locate -i my | grep '/home/jack' | grep -v '/\.'

0

这应该起作用-仅匹配非隐藏的文件和文件夹:

find /home/jack -name "[^.]*My.*"

甚至更简单-这将匹配目录树中任何位置都没有隐藏目录的文件。可能这就是您想要的:

for f in /home/jack/**/*My.*
    do echo "$f" # or do any other command
done

我更喜欢使用locate,因为我正尝试将其集成到Python GUI中以在键入时进行搜索,并且速度更快。但是还是要谢谢!
杰克·琼斯

@JackJones您甚至不需要locate加快结果。例如:echo /home/jack/**/*My.*
jayhendren
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.