Everything查询语法整理
学习整理一下 everything 的高级用法吧,感觉这对于提高 Windows 上的生产力很有帮助。(不砍柴,光想着磨刀 ing)
everything 的基本工作流程:
输入一个指令或多个指令的组合
everything 对输入指令进行解析,获取具体要求(解析规则受到筛选器以及设置中的选项影响)
everything 在数据库中进行检索,检索的项可能是:文件或文件夹的直接名称,或含有绝对路径的完整名称,这与具体情况和开启的选项有关。
检索是否与指令的具体要求相符,返回满足要求的所有项(不区分文件/文件夹)
注:Windows 在文件名和文件夹名称当中不能包含如下特殊字符,允许出现空格
1 | \ / : * ? " < > | |
这些特殊字符可能在 everything 中有特殊的语法作用。
1. 搜索选项
我们首先关注菜单栏->搜索的部分选项:
解释一下:(如图即是默认的状态)
区分大小写
全字匹配:
- 不开启全字匹配:我们输入
txt
可能匹配到a.txt
或者txt2.zip
,即txt
可能不是作为一个完整单词 - 开启全字匹配:确保
txt
只会作为一个完整单词出现,不允许txtxt
这样的项
- 不开启全字匹配:我们输入
匹配路径:见下文的讨论
匹配变音标记:开启后支持从
a
自动查找到变音字母ä
,基本用不上使用正则表达式:见下文(这个模式很特殊,因为开启后会导致前面的很多语法失效)
筛选器:默认所有,可以用来直接筛选一些文件类型
然后关注工具->选项->搜索里面的部分选项:
解释一下:(如图即是默认的状态)
- 快速 ASCII 搜索,这个不重要,pass
- 匹配路径分隔符,见下文的讨论
- 使用通配符时匹配完整文件名:关闭时
a*b
可能还匹配到a-bc
,即部分满足含有通配符的表达式 - 支持操作符:额外支持直接使用
AND,OR,NOT,(如果文件名含有这个可能也会匹配到)默认是
space
,|
,!
- 允许圆括号:额外支持逻辑分组时使用
()
,(如果文件名含有这个可能也会匹配到)默认是<>
- 扩展系统环境变量:支持例如
%APPDATA%
自动替换为环境变量中的路径,(如果文件名含有%可能也会匹配到) - 允许前斜杠作为路径分隔符:额外支持
/
视作分隔符
2. 匹配模式
关于是匹配名称部分还是匹配含有路径的完整名称部分,everything 支持如下的三种模式:
如果开启了匹配路径选项,则一直匹配完整部分
如果关闭匹配路径选项,但是开启了匹配路径分隔符选项,则
在检测到含有路径分隔符(
\
,可能还有/
)时,匹配完整部分在其它情况下,匹配名称部分
如果两个选项都被关闭,则只匹配名称部分
建议使用第二种模式,这也是默认情况。
这里对于盘符的处理有一些特殊:
G:
会匹配完整部分,匹配结果是 G 盘的所有项,也包括 G 盘自身G:\
会匹配完整部分,匹配结果是 G 盘的所有项,但是不含 G 盘自身
这里的一切都不涉及到正则表达式模式,它很特殊,会导致这里的很多语法失效。
3. 基本用法
以下的例子都是在关闭匹配路径选项,但是开启了匹配路径分隔符选项的前提下,即默认模式。
并且没有开启正则表达式模式。
简单指令
指令:查找名称含有abc
的文件和文件夹
1 | abc |
指令:查找 D 盘的所有项
1 | d: |
指令:查找 D 盘的 code 文件夹以及其中的所有项,包括 code
文件夹自身,还可能有这样的项:d:\codetmp
,d:\codetmp\a
1 | d:\code |
指令:查找 D 盘的 code 文件夹下的所有项,不包括 code 文件夹自身
1 | d:\code\ |
指令:查找含有空格时,加引号,否则空格会被理解为两个指令,例如
1 | "c:\program files\" |
指令:查找完整名称含有\lib
片段的项
1 | \lib |
指令:查找名称含有lib
的文件或文件夹
1 | lib |
它和前者不一样,这里默认不会匹配到路径部分,只会匹配名称部分。
逻辑组合
前面使用的指令是直接匹配完整名称的片段,我们可以对这些指令进行逻辑组合,达到更丰富的效果。
- 逻辑与,使用空格
- 逻辑或,使用
|
- 逻辑非,使用
!
默认三者的优先级:逻辑非>逻辑或>逻辑非。在设置中也可以调整逻辑与和逻辑或的顺序。
指令:\lib
指令和\include
的组合,要求同时达到
1 | \lib \include |
可能出现的匹配项例如
1 | E:\miniconda3\Library\include |
指令:`\lib
指令和\include
的组合,要求至少有一个达到
1 | \lib | \include |
指令:\lib
指令必须达到,\include
指令不允许达到
1 | !\lib |
指令:D:\code\
指令必须达到,\lib
和\include
至少有一个达到
1 | D:\code\ \lib | \include |
这里的简单逻辑组合显然是不够的,我们还需要引入括号去明确优先级,这里需要使用中括号<>
。
指令:在 D 盘或 E 盘查找.dll.a,只查找名称部分
1 | <D: | E:> .dll.a |
注意:
- 在工具-选项-搜索中,可以打开支持小括号的选项,此时下面的指令就是合法的(默认不支持小括号
()
,因为这可能出现在路径或文件名中,但是也可以开启选项)
1 | (D: | E:) .dll.a |
可以打开支持操作符的选项,此时就可以使用
AND
代表逻辑与,使用OR
代表逻辑或,使用NOT
代表逻辑非。(默认不打开,因为可能这些词出现在文件名中)可以使用搜索-高级搜索,提供 GUI 界面,支持大部分的组合指令需求。
4. 进阶用法
通配符
这是两个类似正则表达式的通配符,注意现在我们并没有开启正则表达式选项!
*
匹配 0 个或任意个任意字符?
匹配 1 个任意字符
可以直接嵌入到之前的指令中,例如
1 | D:\base\ *Config.cmake |
这里查找指定目录下的所有的*Config.cmake 模块
例如查找系统中的 qt4 或 qt5 的 cmake 模块
1 | qt?config.cmake |
例如查找文件名后缀长度为 2 的所有文件
1 | *.?? |
例如查找指定目录下的所有 markdown 文件
1 | D:\ *.md |
修饰符
everything 可以直接在搜索中输入修饰符,设置相应的解析规则。
如果 GUI 层面也提供了同样的选项,那么直接输入修饰符的优先级更高,会覆盖 GUI 层面的选项。
case:
区分大小写,nocase:
不区分大小写file:
仅匹配文件folder:
仅匹配文件夹path:
匹配路径和文件名,nopath:
只匹配文件名regex:
启用正则表达式,noregex:
禁用正则表达式,建议只对指定的项开启正则表达式支持wholefilename:
或者wfn:
出现通配符时匹配完整文件名nowholefilename:
或者nowfn:
出现通配符时不匹配完整文件名
修饰符的使用非常严苛:必须放在想要作用的指令前,只对接下来的一个指令生效,并且不能含有空格!
例如
1 | nowfn:demo*_ exe: |
这里设置不匹配完整文件名,即可以允许demo_1.exe
。
例如
1 | nowfn:demo* wfn:libdemo* |
这个指令可以允许
libdemo.a
,但是下面的指令缺不允许,两个都要求完全匹配,前后矛盾
1 | wfn:demo* wfn:libdemo* |
简单函数
指的是不需要参数的函数,这里只列举常见的几个:
dupe:
在搜索结果再次搜索重复出现的文件名(常用)empty:
搜索空文件夹(常用)root:
搜索没有父文件夹的文件/文件夹,在 Windows 上就是那几个盘
例如查找指定目录下的空目录(递归)
1 | d:\code\ empty: |
复杂函数
指的是需要参数的函数,这里只列举常见的几个,语法都是类似的。
文件扩展名
语法为
1 | ext:txt |
多个候选项以分号分隔,匹配到任何一个文件扩展名均可。
注意这里不需要也不能给扩展名加点,并且不会匹配到同名的文件夹,但是如果有多个后缀,例如a.cpp.txt
也是成功匹配到最后的txt
扩展名。
例如查找指定目录下的 cpp 文件和 h 文件
1 | ext:cpp;h D:\codeRoot\ |
前面的筛选器本质上是使用了这个函数进行的封装。
例如可执行文件的筛选器这个宏exe:
实际上是下面的函数内容
1 | ext:bat;cmd;exe;msi;msp;scr |
文件大小
语法为
1 | size:10KB |
这里既可以指定文件大小,也可以指定文件的大小范围,单位支持 KB|MB|GB。
还支持这样的描述性大小
1 | size:empty 0KB |
文件时间
指定创建日期的语法
1 | datecreated:<date> |
指定修改日期的语法
1 | datemodified:<date> |
关于日期的写法有很多种,例如
- 今天 today
- 昨天 yesterday
- 指定日期 20220801
它甚至还支持英文的月份/星期的全称或缩写。
例如:今天创建的项
1 | dc:today |
例如:昨天修改的项
1 | dm:yesterday |
还可以使用前面文件大小的比较关系
例如,2023 年之后创建的项
1 | dc:>2023 |
在指定的开始和结束日期之间创建的项
1 | dc:20210801-20220801 |
在指定父目录下的文件/文件夹
示例如下
1 | parent:D:\code\ |
指定在 D:(不会递归进行),这里的父目录似乎要提供完整路径。
注意不要写出 parents,那个是指定计数的。
含有指定子文件的文件夹
示例如下
1 | child:lib |
指定名称中查找含有 lib
的文件所出现的文件夹,即文件夹会含有lib
可以匹配名称的文件。
指定搜索结果的最大值
示例如下
1 | count:1000 |
最多展示 1000 条结果。
宏
特殊字符
因为 everything 占用了很多特殊字符,虽然它们不太可能出现在文件名/文件夹名称中,但是还是提供了这些特殊字符的替代名称(以宏的形式)
'
apos:"
quot:&
amp:<
lt:>
gt:
筛选器
我们可以用筛选器快速筛选指定类型的文件,这里的实现是基于指定文件扩展名的函数的。
例如
- 视频文件 video:
- 音频文件 audio:
- 图片文件 pic:
- 可执行文件 exe:
- 文档文件 doc:
- 压缩文件 zip:
例如,查找含有 demo 的可执行文件,(这里前后顺序无所谓)
1 | exe: demo |
筛选器只需要和其它指令一样输入即可,与其它指令并没有顺序要求。
5. 正则表达式
如果在搜索菜单栏开启这个选项,那么上文中的很多语法都会失效!因此这个选项非常危险。
但是正则表达式在搜索中确实非常强大,everything
为它提供了足够的支持。建议默认关闭正则表达式模式,在需要正则表达式的指令前面专门使用regex:
来启用。
官方文档的例子
a|b
匹配 a 或 bgr(a|e)y
匹配 gray 或 grey.
匹配任意字符(注意这里的点会导致原本的搜索语法都实现!!!)[abc]
匹配这里提到的任意字符,a 或 b 或 c[^abc]
匹配没有被提到的任意字符,只要它不是 a 或 b 或 c[a-z]
匹配所有小写字符[a-zA-Z]
匹配所有大小写字符^
匹配文件名头部$
匹配文件名尾部- 。。。
不想抄了,有机会专门整理正则表达式再说吧。