过滤
过滤框按名称、所在文件夹、大小、时间、文件类别、标签和属性挑出文件。匹配的文件在图上保持亮色,其余的暗下去,侧栏按大小列出匹配结果。按 / 或 Ctrl+F 进入过滤框,边输入边生效。
:class:视频;>1gb;m>1y这条表达式找出大于 1 GB、一年多没改过的视频。
| 表达式 | 找出 |
|---|---|
*.mp4;*.mkv |
名称是 *.mp4 或 *.mkv 的文件 |
>1gb;<10gb |
占用在 1 GB 到 10 GB 之间 |
s>=1mb |
逻辑大小(文件长度)至少 1 MB |
m<10min |
最近 10 分钟内修改过 |
c>1y |
创建于一年多以前 |
\temp |
位于名为 temp 的文件夹里(任意一层) |
|*.exe;|*.dll |
除 .exe、.dll 以外的所有文件 |
:attr:h-s |
隐藏但不是系统文件 |
:red;:yellow 或 :tag:r+y |
带红色或黄色标签 |
:class:视频 |
视频类文件 |
"a;b.txt" |
名字就叫 a;b.txt 的文件 |
表达式怎么读
Section titled “表达式怎么读”表达式是一串用 ; 分隔的条件。条件两侧的空白忽略,空的段忽略,过滤框为空表示不过滤。关键字、前缀、单位、标签颜色、属性名都不区分大小写,文件名也不区分。
每个条件按开头的字符归类:先跳过开头的空白和表示取反的 |,再按顺序取第一条成立的规则:
同一类的条件之间是「或」,不同类之间是「且」;大小和时间的界之间总是「且」,所以两个界组成一个区间;取反的条件是「且非」。书写顺序和重复都不影响结果。
| 类 | 写法 | 有多个时 |
|---|---|---|
| 是什么 | *.mp4、:class:视频 |
满足任意一个(名称和类别算同一组) |
| 在哪里 | \Downloads |
满足任意一个 |
| 标签 | :red、:tag:r+y |
满足任意一个 |
| 大小与时间 | >1gb、m<7d |
全部满足 |
| 属性 | :attr:h |
全部满足 |
| 取反的条件 | |*.tmp、|\node_modules |
一个都不能满足 |
所以 *.mp4;*.mkv;\Downloads;>1gb;|\Temp 的意思是:(mp4 或 mkv)且位于名为 Downloads 的文件夹里,且大于 1 GB,且不在名为 Temp 的文件夹里。
只有文件会匹配
Section titled “只有文件会匹配”文件夹本身从不匹配。文件夹下面只要有文件匹配,它就处于「含匹配」状态,匹配的文件数和大小逐级汇总到各个文件夹。这里的「文件」指文件夹以外的一切条目:普通文件、符号链接和其他特殊文件。一个文件有多个硬链接时,多出来的链接计入匹配文件数,但不重复计入大小,和图上的算法一致。
名称掩码与完整文件名(含扩展名)做通配匹配。
?匹配恰好一个字符,*匹配任意多个字符(包括零个)。mp4只匹配名字就叫mp4的文件;要匹配「名字里含 mp4」,写*mp4*。*.*要求名字里有点,所以不匹配README。- 所有平台上都不区分大小写。
- 不带引号的掩码里不能有
\、|、<、>;需要时把名字放进引号。
\掩码:文件路径上任意一层文件夹的名字与掩码匹配,这个文件就匹配。参与比较的是从扫描根到文件所在文件夹之间的每一层。\temp 会找到 C:\Windows\Temp\data\abc.txt。
- 开头的
\只是标记,不表示根;它后面的空白忽略。 - 文件夹掩码是一个文件夹名,不是路径:
\temp\x会报错。 - 扫描根按它自己的名字参与:扫描
D:\Photos时,\Photos匹配这次扫描里的所有文件。盘符根或文件系统根(C:\、/)的名字为空,只有\*能匹配它。扫描根以上的路径不参与,所以结果与从哪里开始扫描无关。 - 命中文件夹掩码的文件夹在树图和火焰图里以粗体名称显示。
- 通配符与名称相同:
\*cache*匹配名字里含cache的任何文件夹。
写法是「[前缀] 运算符 数字 单位」,例如 >1gb、s<=4kb、>= 1.5 GB。各部分之间可以有空格。
| 前缀 | 比较对象 |
|---|---|
无、d、disk、disksize、clustersize |
占用大小(分配给文件的空间) |
s、size、filesize、logicalsize |
逻辑大小(文件长度) |
| 单位 | 字节 |
|---|---|
b |
1 |
kb、kib |
1024 |
mb、mib |
1024² |
gb、gib |
1024³ |
tb、tib |
1024⁴ |
pb、pib |
1024⁵ |
- 运算符名副其实:
>大于,>=大于等于,<小于,<=小于等于。 - 过滤里的单位固定按 1024 进位,与界面显示大小用的进制无关。
- 可以写小数:
>1.5gb就是大于 1536 MB,按字节精确比较。 - 单位不能省略:
>500会报错,因为不带单位分不清是大小还是时间。大小单位一律以b结尾,所以单独的k、g也会报错,要写kb、gb。 - 上限是 2⁶² 字节。
写法是「[前缀] 运算符 数字 单位」,例如 m<7d、c>1y。时间条件比较的是年龄,即从这个时间到现在过了多久。< 表示在这段时间以内(更新),> 表示早于这段时间(更旧)。
| 前缀 | 时间 |
|---|---|
无、m、modify、modified |
修改时间 |
c、create、created |
创建时间 |
a、access、accessed |
访问时间 |
| 单位 | 长度 |
|---|---|
s、sec、secs、second、seconds |
1 秒 |
m、min、mins、minute、minutes |
1 分钟 |
h、hr、hrs、hour、hours |
1 小时 |
d、day、days |
1 天 |
w、wk、wks、week、weeks |
7 天 |
mon、month、months |
30 天 |
y、yr、yrs、year、years |
365 天 |
m在运算符前面是「修改时间」前缀,在数字后面是「分钟」:m<10m就是 10 分钟内修改过。- 月、年是固定长度,与日历无关。
- 前缀和单位必须同类:
s<5d会报错,因为s是逻辑大小的前缀;m>1mb同理。 - 时间未知的文件不满足任何时间条件,取反后也不满足。比如 Linux 不提供创建时间。
- 上限是 1000 年。
- 扫描数据有变化时会重新求值:扫描进行中,以及实时监控报告变化时。开着监控,
m<10min能跟上新写入的文件。
:class:类别名 匹配某个文件类别的文件。类别名一直到条件末尾,可以含空格和 /,不区分大小写。一个类别的所有名字都能用:两种界面语言下的显示名、别名和 id。
| 类别 | 也可以写 |
|---|---|
| 视频 | video、Video、Videos、Movies、Video/Movies |
| 图片 | image、Image、Images、Picture、Pictures、Pictures/Images、Photos |
| 音频 | audio、Audio、Music、Audio/Music |
| 压缩包/镜像 | archive、压缩包、镜像、Archive、Archives、Disk images、Archives/Disk images |
| 程序/系统 | exec、程序、系统、Program、Programs、Executable、Executables、System files、Executables/System files |
| 文档 | doc、Document、Documents、Docs |
| 游戏 | game、Game、Games |
| 代码/开发 | code、代码、开发、Code、Source code、Development、Dev |
| 数据/模型 | data、数据、模型、Data、Datasets、Models、Databases |
| 其他 | other、Other、Others、Unclassified |
- 类别按扩展名匹配:名字里最后一个点之后的部分。开头的点不算,所以
.bashrc没有扩展名。ts和mts还要看文件大小,分成视频和代码,见内置类别。游戏、项目等认得出的文件夹里,文件按文件夹的类别算::class:游戏找得到游戏里的视频,:class:视频找不到,见按文件夹归类。 :class:其他匹配扩展名不属于任何类别的文件,包括没有扩展名的文件。- 不存在的类别名会报错,补全列表里列出可用的类别。
- 类别和扩展名可以自己改,见标签与文件类别。
:red、:yellow、:green、:blue 匹配带对应标签的文件,:all 匹配带任意标签的文件。
- 完整写法是
:tag:加一个列表:从一项开始,+加入一种颜色,-去掉一种颜色;颜色可以缩写成r、y、g、b。:tag:red+yellow是红或黄,:tag:all-red是有标签但不是红。 - 多个标签条件之间是「或」:
:red;:yellow与:tag:r+y相同。 - 文件夹上的标签对其中的所有内容都有效:给文件夹打红色标签,
:red就匹配它里面的所有文件。 |:all匹配没有任何标签的文件。- 在设置里给标签起的显示名不影响语法,红色标签永远写
:red。
怎么打标签见标签与文件类别。
:attr:(或 :attrs:)后面跟属性列表。+ 或 , 表示「同时具备」,属性前的 - 表示「不具备」,- 也可以直接当分隔符,所以 :attr:a+h-s 与 :attr:a,h,-s 相同:归档、隐藏、不是系统。
| 属性 | 简写 | 属性 | 简写 |
|---|---|---|---|
archive 归档 |
a |
offline 脱机 |
o |
system 系统 |
s |
temporary 临时 |
t |
readonly 只读 |
r |
notindexed 不索引 |
ni |
hidden 隐藏 |
h |
sparse 稀疏 |
sp |
compressed 压缩 |
c |
alternatedatastream 备用数据流 |
ads |
encrypted 加密 |
e |
- 多个
:attr:条件要全部满足。 :attr:-a表示没有归档属性;|:attr:a是对整个属性条件取反。- 各平台记录哪些属性,见平台差异。
任何条件前加 | 就是取反,| 后面的空白忽略。
- 名称、类别、文件夹、标签、属性条件取反表示排除满足它的文件:
|*.tmp、|\node_modules、|:class:视频、|:green、|:attr:h。 - 大小、时间条件取反表示反向区间:
|>1mb等于<=1mb,|<5d等于>=5d。时间未知的文件仍然不匹配。
引号与字面名称
Section titled “引号与字面名称”名字里有会被当成语法的字符时,把它放进双引号。
- 引号里的
;、首尾空白、|、<、>都按普通字符处理。 \转义下一个字符:\*、\?是字面的星号和问号,\"是引号,\\是反斜杠。- 不带反斜杠的
*、?在引号里仍是通配符。 - 引号只在条件开头起作用(前面可以有
|或\):|"~$*"、\"my;folder"都可以。
有了引号,任何文件名都能按字面匹配,包括 Linux 上含 ;、*、\ 的名字:"a;b.txt"、" 开头有空格.txt"、"report\*.pdf"。
| 表达式 | 找出 |
|---|---|
*.iso;*.img;>1gb |
大于 1 GB 的镜像文件(按名称) |
:class:压缩包/镜像;>1gb |
大于 1 GB 的压缩包和镜像(按类别) |
:class:视频;>1gb;m>1y |
大于 1 GB、一年没改过的视频 |
s>=4gb |
长度至少 4 GB 的文件 |
>1gb;<10gb |
占用在 1 GB 到 10 GB 之间的文件 |
c<7d;>100mb |
本周创建、大于 100 MB 的文件 |
a>1y;>100mb |
一年没人打开过(访问时间)、大于 100 MB 的文件 |
m<10min |
最近 10 分钟的改动 |
\node_modules |
所有 node_modules 文件夹里的内容 |
\node_modules;m>90d |
90 天没动过的 node_modules 内容 |
|\node_modules;|\.git;>50mb |
node_modules 和 .git 以外、大于 50 MB 的文件 |
\*cache*;>10mb |
名字含 cache 的文件夹里大于 10 MB 的文件 |
*.log;*.tmp;m>30d |
30 天以前的日志和临时文件 |
|:class:视频;|:class:图片;|:class:音频;>500mb |
不是媒体文件的大文件 |
:class:其他;>100mb |
扩展名不属于任何类别的大文件 |
\DCIM;|*.jpg |
DCIM 文件夹里所有不是 JPEG 的文件 |
|.* |
除点开头的文件以外的所有文件 |
:attr:h-s |
隐藏但不是系统文件 |
:attr:c |
NTFS 压缩的文件 |
:red;:yellow |
带红色或黄色标签的文件(直接打的,或继承自文件夹) |
|:green;>1gb |
大于 1 GB、没有绿色标签的文件 |
|:all;>1gb |
没有任何标签、大于 1 GB 的文件 |
*.mp4;*.mkv;\Downloads;>1gb;|\Temp |
Downloads 里的大 mp4、mkv,但不在 Temp 里 |
"a;b.txt" |
名字就叫 a;b.txt 的文件 |
- 过滤框给表达式的各部分着色(名称、比较、关键字、取反),出错的部分加波浪下划线。
- 有可选内容的地方会弹出补全列表:输入
:之后,:class:、:tag:、:attr:后面,这些列表里的+、,、-之后,数字后面(单位),条件开头(前缀)。类别候选带类别色和几个示例扩展名,属性候选带中文名和简写。 - 列表底部是速查行:大小
>1gb、时间m<7d、标签:red、属性:attr:h、取反|。 - 光标所在、还没写完的条件不报错、不参与求值,「条件」块里显示为虚线的「选择中…」胶囊。同样的写法不在光标处时按错误处理。
- 停顿片刻后生效;按 Enter 立即生效。
- 表达式有错误时,界面保留上一次有效的结果,浮动条显示「表达式有误,显示的是上一次的结果」,补全列表里显示第一处错误,还有其他错误时附上「(还有 2 处)」这样的说明。每个条件单独检查,一处写错不影响其他条件的提示。
| 提示 | 原因 | 例 |
|---|---|---|
| 条件还没写完 | 缺少必需的部分 | |、\、:、>、:class:、"" |
| 引号没有闭合 | 缺少闭合的 " |
"abc |
| 闭合引号后面还有内容 | 闭合的 " 后面还有字符 |
"abc"x |
| 引号内末尾的反斜杠 | \ 后面没有可转义的字符 |
"abc\ |
| 掩码里不能有反斜杠,需要时用引号 | 名称或文件夹掩码里有 \ |
\temp\x |
| 掩码里不能有 | < >,需要时用引号 | 掩码里有 |、<、> |
a|b |
| 未知关键字 | 不是已知的 : 关键字 |
:foo |
| 未知类别 | 没有这个类别 | :class:nosuch |
| 未知标签颜色 | 不是 red、yellow、green、blue、all | :tag:purple |
| 未知属性 | 不在属性表里 | :attr:z |
| 列表格式不对 | :tag: 或 :attr: 列表写错 |
:attr:h++r、:tag:+red |
| 未知前缀 | 不是大小或时间前缀 | x>1mb |
| 无法识别的运算符,可用 | 只有 <、>、<=、>= |
=>1mb、<>1mb |
| 数字不合法 | 不是普通的十进制数 | >abc、>.5mb、>1,5mb、>-1mb |
| 缺少单位,可用 | 数字后面没有单位 | >500 |
| 无法识别的单位,可用 | 不是大小或时间单位 | >500xb、d<16k |
| 前缀与单位不同类,可用 | 大小前缀配时间单位,或反过来 | s<5d |
| 数值超出上限 | 超过 2⁶² 字节或 1000 年 | >99999999pb |
| 此平台不记录 | 警告:写法合法,但当前平台不记录这一项 | Linux 上的 c<5d |
以「可用」结尾的提示后面会列出这里能用的写法。
匹配统计浮动条
Section titled “匹配统计浮动条”过滤生效时,图的右上角出现浮动条,显示匹配数和大小(如「匹配 36 项 · 96.4 GB」)以及占总量的比例,以及不匹配项的显示方式:
- 暗化不匹配(默认):布局不变,不匹配的块暗化,含匹配项的文件夹保持正常。
- 隐藏不匹配:去掉所有不匹配的项,只按匹配部分的大小重新布局;可用空间和未知空间也不显示。
每个视图各自记住这个选择。浮动条里的数字统计的是当前位置下的匹配,放大进入后范围随之缩小。
过滤生效时,侧栏变成「匹配结果」;清空过滤后回到详情面板。过滤不一定是自己在过滤框里输入的(在「类别统计」里点一个类别也会过滤),清除的地方有好几处:
-
「匹配结果」标题右边的「清除过滤」;
-
图上方匹配统计条右端的 ×;
-
在图上按 Esc:第一次取消选中,再按一次清除过滤;
-
过滤框里的 ×,或在过滤框里按 Esc。
-
汇总区显示匹配的总大小和文件数,以及占已扫描总量的比例条。
-
「条件」块把表达式翻译成胶囊,每类一个:名称、类别、文件夹、标签、大小、逻辑大小、修改时间、创建时间、访问时间、属性,以及取反条件对应的「排除…」。同一个胶囊里的值按上面的组合规则用「或」「且」连接。
-
列表跟着图走:单独画成一块的匹配文件是一行;收起的文件夹、「N 个小项」块里的匹配合成那一块的一行,并显示其中匹配的文件数。排序菜单有「按大小」「按名称」「按项数」,每个视图各自记住。
-
行上显示标签标记,包括继承自文件夹的标签。
-
列表只包含当前位置下的匹配。显示「当前位置下没有匹配项」时,按 Alt+↑ 回到上一级,在更大的范围里找。
单击一行,在图上选中它的块;如果这一块在当前位置或细节层级下没有画出来,视图会先导航到能显示它的地方,可以用后退回来。双击或按 Enter 放大进入;右键打开与图上相同的菜单;鼠标悬停时图上对应的块同步高亮。
| 按键 | 位置 | 作用 |
|---|---|---|
| / 或 Ctrl+F | 扫描标签页,焦点不在输入框里 | 聚焦当前窗格的过滤框 |
| ↑ ↓ | 过滤框,补全列表打开时 | 在候选之间移动 |
| Tab | 过滤框,补全列表打开时 | 填入选中的候选并立即求值 |
| Enter | 过滤框 | 立即生效,不等停顿 |
| Esc | 过滤框 | 补全列表打开时关闭它;否则清空过滤;框已经为空时离开过滤框 |
| ↑ ↓ | 匹配结果列表 | 在行之间移动(图上同步高亮) |
| Home End | 匹配结果列表 | 第一行、最后一行 |
| PgUp PgDn | 匹配结果列表 | 上一页、下一页 |
| Space | 匹配结果列表 | 在图上定位这一行 |
| Enter | 匹配结果列表 | 放大进入这一行 |
| Delete | 匹配结果列表 | 把这一行的文件或文件夹加入删除篮 |
| Alt+↑ | 扫描标签页 | 上一级,在更大范围里看匹配 |
| Ctrl+K | 任意位置 | 命令面板,可以在里面预览过滤 |
macOS 上这些键里的 Ctrl 也可以换成 ⌘。全部按键见快捷键。
在命令面板里过滤
Section titled “在命令面板里过滤”在命令面板(Ctrl+K)里也可以输入过滤式:含有 *、?、;、|、<、>、:、",或以单个 \ 开头的输入按过滤处理(以 \\ 开头的是网络路径)。「过滤 …」这一行在应用之前就显示会匹配多少文件、多大空间,按 Enter 应用到当前视图。
从命令面板执行过的过滤会记在「最近」组里,最新的在前,所有扫描共用。每一条都显示它在当前扫描里的匹配数和大小,可以当作保存的搜索反复使用。
分屏时每个窗格都有自己的过滤框(「过滤此窗格」)和浮动条,侧栏显示焦点窗格的匹配结果。可以用它并排看同一次扫描的两种过滤,比如左边 :class:视频,右边 :class:图片。
- 名称匹配在所有平台上都不区分大小写。
- Windows 记录属性表里的全部属性;
ads可以写,但会给出「此平台不记录」的警告。 - Linux 和 macOS 只记录
hidden,即以点开头的名字。其他属性条件给出警告,并把所有文件都当作不具备该属性::attr:r什么都不匹配,:attr:-r匹配全部。 - Linux 不提供创建时间:
c条件给出警告,不匹配任何文件。
SpaceSniffer 的过滤式
Section titled “SpaceSniffer 的过滤式”为 SpaceSniffer 写的过滤式在 SpaceKnife 里照样能用,它帮助里的示例也一样(d<16k 要写成 kb,见下文)。
下面这些规则保证每个表达式只有一种明确的含义:
>、<是严格比较;需要包含边界时用>=、<=。- 取反的大小、时间条件是反向区间:
|>1mb就是<=1mb。 - 同一侧的多个界取交集:
>1mb;>2mb就是>2mb。 |和\后面的空白忽略;以空格开头的名字请加引号。- 表里列出的前缀拼写全部有效,包括
created、accessed。 - 文件夹掩码只看扫描根自己的名字及其以下,不看扫描根以上的路径。
- 永远不可能匹配的写法直接报错,而不是返回空结果:
\temp\x、:foo、不带引号却含|、<、>的掩码。 - 单独的
k不是单位:d<16k要写成d<16kb。