跳转到内容

过滤

过滤框按名称、所在文件夹、大小、时间、文件类别、标签和属性挑出文件。匹配的文件在图上保持亮色,其余的暗下去,侧栏按大小列出匹配结果。按 / 或 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 的文件

表达式是一串用 ; 分隔的条件。条件两侧的空白忽略,空的段忽略,过滤框为空表示不过滤。关键字、前缀、单位、标签颜色、属性名都不区分大小写,文件名也不区分。

每个条件按开头的字符归类:先跳过开头的空白和表示取反的 |,再按顺序取第一条成立的规则:

  1. 以 \ 开头:文件夹掩码。
  2. 以 : 开头:关键字条件,即类别、标签、属性。
  3. 以 " 开头:带引号的名称。
  4. 含有 < 或 >:大小或时间比较。
  5. 其他:名称掩码。

同一类的条件之间是「或」,不同类之间是「且」;大小和时间的界之间总是「且」,所以两个界组成一个区间;取反的条件是「且非」。书写顺序和重复都不影响结果。

类 写法 有多个时
是什么 *.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 的文件夹里。

文件夹本身从不匹配。文件夹下面只要有文件匹配,它就处于「含匹配」状态,匹配的文件数和大小逐级汇总到各个文件夹。这里的「文件」指文件夹以外的一切条目:普通文件、符号链接和其他特殊文件。一个文件有多个硬链接时,多出来的链接计入匹配文件数,但不重复计入大小,和图上的算法一致。

名称掩码与完整文件名(含扩展名)做通配匹配。

  • ? 匹配恰好一个字符,* 匹配任意多个字符(包括零个)。
  • 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。时间未知的文件仍然不匹配。

名字里有会被当成语法的字符时,把它放进双引号。

  • 引号里的 ;、首尾空白、|、<、> 都按普通字符处理。
  • \ 转义下一个字符:\*、\? 是字面的星号和问号,\" 是引号,\\ 是反斜杠。
  • 不带反斜杠的 *、? 在引号里仍是通配符。
  • 引号只在条件开头起作用(前面可以有 | 或 \):|"~$*"、\"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

以「可用」结尾的提示后面会列出这里能用的写法。

过滤生效时,图的右上角出现浮动条,显示匹配数和大小(如「匹配 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 也可以换成 ⌘。全部按键见快捷键。

在命令面板(Ctrl+K)里也可以输入过滤式:含有 *、?、;、|、<、>、:、",或以单个 \ 开头的输入按过滤处理(以 \\ 开头的是网络路径)。「过滤 …」这一行在应用之前就显示会匹配多少文件、多大空间,按 Enter 应用到当前视图。

从命令面板执行过的过滤会记在「最近」组里,最新的在前,所有扫描共用。每一条都显示它在当前扫描里的匹配数和大小,可以当作保存的搜索反复使用。

分屏时每个窗格都有自己的过滤框(「过滤此窗格」)和浮动条,侧栏显示焦点窗格的匹配结果。可以用它并排看同一次扫描的两种过滤,比如左边 :class:视频,右边 :class:图片。

  • 名称匹配在所有平台上都不区分大小写。
  • Windows 记录属性表里的全部属性;ads 可以写,但会给出「此平台不记录」的警告。
  • Linux 和 macOS 只记录 hidden,即以点开头的名字。其他属性条件给出警告,并把所有文件都当作不具备该属性::attr:r 什么都不匹配,:attr:-r 匹配全部。
  • Linux 不提供创建时间:c 条件给出警告,不匹配任何文件。

为 SpaceSniffer 写的过滤式在 SpaceKnife 里照样能用,它帮助里的示例也一样(d<16k 要写成 kb,见下文)。

下面这些规则保证每个表达式只有一种明确的含义:

  • >、< 是严格比较;需要包含边界时用 >=、<=。
  • 取反的大小、时间条件是反向区间:|>1mb 就是 <=1mb。
  • 同一侧的多个界取交集:>1mb;>2mb 就是 >2mb。
  • | 和 \ 后面的空白忽略;以空格开头的名字请加引号。
  • 表里列出的前缀拼写全部有效,包括 created、accessed。
  • 文件夹掩码只看扫描根自己的名字及其以下,不看扫描根以上的路径。
  • 永远不可能匹配的写法直接报错,而不是返回空结果:\temp\x、:foo、不带引号却含 |、<、> 的掩码。
  • 单独的 k 不是单位:d<16k 要写成 d<16kb。