locate我在使用密钥查找文件时遇到问题-r,--regexp
~$ locate --help | grep regex
-r, --regexp REGEXP search for basic regexp REGEXP instead of patterns
--regex patterns are extended regexps
在 PCRE 中有一个不良模式列表,如下所示:
'.*/[0-9]{1,3}-.{16}\.txt'
例子
~$ ls -gaG *-*txt | head
-rw-rw-r--. 1 0 Aug 13 21:32 100-gp9hQhTvaySlmrua.txt
-rw-rw-r--. 1 0 Aug 13 21:32 10-nvvYcrUpduSbWuaj.txt
-rw-rw-r--. 1 0 Aug 13 21:32 11-GEDkBMpKspWsdFu1.txt
-rw-rw-r--. 1 0 Aug 13 21:32 12-O2gSsKGP1KLl56ae.txt
-rw-rw-r--. 1 0 Aug 13 21:32 13-Q1dx492pLFGAiTTs.txt
-rw-rw-r--. 1 0 Aug 13 21:32 14-Lco6Gcisfl5QCvYG.txt
-rw-rw-r--. 1 0 Aug 13 21:32 15-kR75W2oeZ3PoibrE.txt
-rw-rw-r--. 1 0 Aug 13 21:32 16-QicUkZaseC5zr7p8.txt
-rw-rw-r--. 1 0 Aug 13 21:32 17-7ERZ7lnUX7RQQXZI.txt
-rw-rw-r--. 1 0 Aug 13 21:32 18-XbvGQcvrToIqNOSA.txt
~$ ls -gaG | head | grep -oP '[0-9]{1,3}-.{16}\.txt'
100-gp9hQhTvaySlmrua.txt
10-nvvYcrUpduSbWuaj.txt
11-GEDkBMpKspWsdFu1.txt
12-O2gSsKGP1KLl56ae.txt
13-Q1dx492pLFGAiTTs.txt
14-Lco6Gcisfl5QCvYG.txt
~$ locate 100 | grep -o 100-gp9hQhTvaySlmrua.txt
100-gp9hQhTvaySlmrua.txt
我更新了数据库,试图用相同的模板找到它,但无济于事。
~$ time locate -r '[0-9]{1,3}-.{16}\.txt'
real 0m1.574s
user 0m1.567s
sys 0m0.004s
~$ time locate -r '*./[0-9]\{1,3\}-.\{16\}\.txt$'
real 0m0.168s
user 0m0.165s
sys 0m0.003s
问题:什么类型的正则表达式引擎locate呢?
这是使用 BRE POSIX:
POSIX BRE(“基本正则表达式”)不同于大多数流行的正则表达式库的语法。
/\([0-9]*\)/=/([0-9]*)/在 POSIX ERE 中。大多数其他风格,包括 POSIX ERE,改为使用反斜杠来“抑制”元字符的含义。那些。要在 BRE POSIX 中查找字符?,必须使用/?/,而不是/\?/。符号(,),+,{和}也是如此|。在 POSIX 模式中,BRE匹配a{1,2}字符串a{1,2},而模式a\{1,2\}匹配aoraa。\(ab\)\1它找到abab并且该模式(ab)\1无效,因为它缺少匹配的捕获子模式。|具有字面意义)。