学习整理一下 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 支持如下的三种模式:

  1. 如果开启了匹配路径选项,则一直匹配完整部分

  2. 如果关闭匹配路径选项,但是开启了匹配路径分隔符选项,则

    • 在检测到含有路径分隔符(\,可能还有/)时,匹配完整部分

    • 在其它情况下,匹配名称部分

  3. 如果两个选项都被关闭,则只匹配名称部分

建议使用第二种模式,这也是默认情况。

这里对于盘符的处理有一些特殊:

  • G: 会匹配完整部分,匹配结果是 G 盘的所有项,也包括 G 盘自身
  • G:\ 会匹配完整部分,匹配结果是 G 盘的所有项,但是不含 G 盘自身

这里的一切都不涉及到正则表达式模式,它很特殊,会导致这里的很多语法失效。

3. 基本用法

以下的例子都是在关闭匹配路径选项,但是开启了匹配路径分隔符选项的前提下,即默认模式。

并且没有开启正则表达式模式。

简单指令

指令:查找名称含有abc的文件和文件夹

1
abc

指令:查找 D 盘的所有项

1
d:

指令:查找 D 盘的 code 文件夹以及其中的所有项,包括 code 文件夹自身,还可能有这样的项:d:\codetmpd:\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
2
3
ext:txt

ext:txt;doc;docx

多个候选项以分号分隔,匹配到任何一个文件扩展名均可。

注意这里不需要也不能给扩展名加点,并且不会匹配到同名的文件夹,但是如果有多个后缀,例如a.cpp.txt也是成功匹配到最后的txt扩展名。

例如查找指定目录下的 cpp 文件和 h 文件

1
ext:cpp;h D:\codeRoot\

前面的筛选器本质上是使用了这个函数进行的封装。

例如可执行文件的筛选器这个宏exe:实际上是下面的函数内容

1
ext:bat;cmd;exe;msi;msp;scr

文件大小

语法为

1
2
3
4
5
6
7
8
9
10
size:10KB
size:MB

size:1MB-MB

size:<100MB
size:<=100MB
size:=100MB
size:>100MB
size:>=100MB

这里既可以指定文件大小,也可以指定文件的大小范围,单位支持 KB|MB|GB。

还支持这样的描述性大小

1
2
3
4
size:empty	0KB
size:tiny 0KB< x <=10KB
size:small 10KB< x <=100KB
...

文件时间

指定创建日期的语法

1
2
datecreated:<date>
dc:<date>

指定修改日期的语法

1
2
datemodified:<date>
dm:<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
2
exe: demo
demo exe:

筛选器只需要和其它指令一样输入即可,与其它指令并没有顺序要求。

5. 正则表达式

如果在搜索菜单栏开启这个选项,那么上文中的很多语法都会失效!因此这个选项非常危险。 但是正则表达式在搜索中确实非常强大,everything 为它提供了足够的支持。建议默认关闭正则表达式模式,在需要正则表达式的指令前面专门使用regex:来启用。

官方文档的例子

  • a|b 匹配 a 或 b
  • gr(a|e)y 匹配 gray 或 grey
  • . 匹配任意字符(注意这里的点会导致原本的搜索语法都实现!!!)
  • [abc] 匹配这里提到的任意字符,a 或 b 或 c
  • [^abc] 匹配没有被提到的任意字符,只要它不是 a 或 b 或 c
  • [a-z] 匹配所有小写字符
  • [a-zA-Z] 匹配所有大小写字符
  • ^ 匹配文件名头部
  • $ 匹配文件名尾部
  • 。。。

不想抄了,有机会专门整理正则表达式再说吧。