macOS 的搜索机制如此完善,兼顾命令行、高级搜索语法、图形化搜索界面和智能文件夹,以至于几乎所有第三方工具引以为傲的搜索功能,基本只是在炒原生功能的冷饭,根本用不着冤枉钱。1
但有一个例外。在关于文件管理的旧作中,我不得不为 HoudahSpot 破例,因为它能够同时搜索多个文件夹,而这一功能正是 macOS 的阿喀琉斯。
不过,是时候宣布原生系统在文件搜索领域的彻底胜利:多文件夹搜索其实早有途径,答案就在智能文件夹(smart folder)中。
何谓多文件夹搜索
注:本就奔着多文件夹搜索来的读者,可以跳过这一段。考虑到多文件夹搜索是一个边缘场景,多数人可能以为是吹毛求疵,故有必要举几个切身例子。搜索者,划定范围,设置条件,仅此而已,如同在一个池子里下网捕鱼。几乎所有讨论都围绕搜索条件,却忽视了池子在哪儿——原生功能也不例外,仅仅提供搜索整台电脑和查找当前文件夹两个选项,不能同时搜索多个目标。由此带来的不便,例言之:鄙人写有一百来篇文章,未及发表,发现其中关于 Keyboard Maestro 几篇引用有误,于是检索关键词 来源文章
(此为拟称),苟按 macOS 的规矩,要么在一百多篇文件中搜索,夹杂大量无关文件;要么逐个打开关于 Keyboard Maestro 话题的文件夹,一一搜索。无论何者,都近乎愚蠢。
换言之,当你明知目标文件可能在一个小范围内时,macOS 预设的两种搜索范围,不是过于宽广,就是太过局限。
除了临时一用,多文件夹搜索也可以固定为常驻的智能文件夹。我(根据下文方法)制作了一个汇集多文件夹近期 PDF 文件的智能文件夹,同时显示最近下载或导入的论文、文章和讨论,但是不展示厚重的书籍——这其实是多文件夹搜索的反向应用:选中其他,效果就相当于排除特定文件夹。
如何实现多文件夹搜索
多文件搜索基于智能文件夹,此“文件夹”实为保存好的一组搜索条件,可繁可简,日后用到时打开即可过滤文件,而无需重复输入搜索条件。需要澄清,多文件夹搜索并非我独创,曾有人研究过如何排除某个特定文件夹,Hum 也在《同时在 Finder 里搜索几个指定文件夹里的文件介绍了这一技术。相关讨论是本文方案的技术基础之一。
核心在于,陆续有人发现智能文件夹其实是一个纯文本文件,因而有直接修改其内容的可能,突破系统限制、任意划定搜索范围当然也有希望。让我们从零开始这段探索。首先建立一个智能文件夹:在任意一个文件夹中,按下 ⌘Command-F
,然后就地保存它——不要输入任何搜索条件,以免掺入没有必要的参数。
随后用文本编辑器打开刚刚创建的智能文件夹,可以看到,其本质上是一段 XML(Extensible Markup Language,可拓展标记语言)文本,其中记录了搜索的两大要素——范围和条件。由于刚才没有输入任何条件,因此目前的条件参数几乎是一片空白,只有范围参数,而这正中下怀。
仔细查看智能文件夹的代码后,可以发现其中有 3 处记录文件夹路径,此为突破点。早已有人发现了这些路径参数,并追加文件夹路径以实现多文件夹搜索,但其方案和更早的一样,很快纷纷失效,然后被归入“新系统下不 work”的奇技淫巧之列,非常可惜。事实上,前面提及的几个方案已经触及核心,只是漏了一些参数——除了需要追加文件路径外,还需要在下图中位置插入 <string>_kMDItemGroupId = 11</string>
参数(如已有,则覆盖),表示没有任何预设条件。2
总体上,需要下个如下五处:
- 将
<key>RawQuery</key>
之下的一行修改为<string>_kMDItemGroupId = 11</string>
; - 另一处
<key>RawQuery</key>
之下的一行,作同样修改; - 在第一次出现路径的地方,换行后追加新文件夹路径,保持格式一致,开头的
/System/Volumes/Data/
和两边的<string>
也要保留; - 在第二次出现路径的地方换行追加路径,保持格式一致,这次不需要
/System/Volumes/Datay/
; - 在第三次出现路径的地方,和上一步同样作同样修改。
随后保存修改,并打开智能文件夹。刚刚打开时可能已经有一些搜索结果在其中,可以发看到,此时已经实现了跨文件夹搜索。继续添加进一步的搜索条件,就可以更细致地过滤文件。
自动化:用 Keyboard Maestro 同时搜索任意选中的文件夹
理所当然,除了第一次摸索外,我从来没有手动创建、修改过智能文件夹,毕竟这功夫可能重于挨个翻找文件夹——还不考虑写错代码前功尽弃的。可一旦想到智能文件夹本质只是一段纯文本,紧接着的自动化思路也就铺好了。我使用 Keyboard Maestro——大概所有自动化工具都可以,只是 Keyboard Maestro 最简单——将生成智能文件夹的流程打包好,每次使用时,只需选中任意多个文件夹,按下快捷键 ⌃Control-⌥Option-⌘Command-F
3,即可在下载文件夹中获得一个智能文件夹,打开就能跨文件夹搜索。
这个 Keyboard Maestro 动作主要做了三件事:第一,预设一个跨文件夹搜索的智能文件夹模板;第二,从当前所选文件夹中获取其路径,并转换为智能文件夹所需的格式,再替换到模板里;第三,把替换好的纯文本保存为智能文件夹(换个后缀名就行)。
至于在何处存放智能文件夹,我选择了下载文件夹,你可以修改“Write Text to File”步骤中的路径,以便选择其他更方便的位置。以下路径中的 %ICUDateTime%yyyyMMddHHmm%
是一个 Keyboard Maestro 自带变量,表示精确到分钟的时间戳——例如当下就是 202302211707
——将时间戳写入只 智能文件夹名称,可以保持其唯一性,不至于被覆盖或和其他智能文件夹混淆。
/Users/Min/Downloads/MultiSearch %ICUDateTime%yyyyMMddHHmm%.savedSearch
其实,Keyboard Maestro 所用的模块并无特殊之处,在 Shortcuts 中均有对应步骤,因此可以直接照抄(或许需要改两个正则表达式的字符,但也仅此而已)。但 Shortcuts 的 bug 已经多到难以维护的地步,比如带 .
的路径很可能报错,并且几乎每次升级系统就就要重新做一遍——iCloud 会看心情删除我的变量!既然 Keyboard Maestro 已经解决我的问题,而制作 Shortcuts 版不过是多一点机械复制工作,我就不出手了,留给确实需要 Shortcuts 版本的读者自己尝试。4
🛍 我撰写的付费栏目《Keyboard Maestro 进阶指引》正在 UNTAG 售卖,详解 Keyboard Maestro Macro 高级设计思路,欢迎选购:付费内容链接
- 这一批评,主要是基于绝大多数搜索工具都使用 Spotlight 索引这一现实,仅有凤毛麟角的软件不需要仰其鼻息——我能想到的(图形化工具)基本只有 EasyFind。 ↩
- 严格意义上的没有预设条件是
false
,但这么写会导致只能搜索参数中的第一个文件夹,因此我参照有效的智能文件夹修改了参数。该参数是绝大多数旧方案失效的原因——我甚至怀疑报错者从来就没有成功过,使用false
的智能文件夹应当自始无效,而不是到最近的系统才出问题。 ↩ - 一般的搜索快捷键是
⌘Command-F
,⌃Control-⌥Option-⌘Command-F
选择了同样的字母键,方便记忆,同时配合了一组不容易冲突的修饰键。 ↩ - 我一般只有非 Shortcuts 不可或者用 Shortcuts 更简单时,才会考虑它。比如和日历交互,显然原生的 Shortcuts 更方便;再如修改文件名乱码,Shortcuts 自带了编码解码模块,可以免去自己写脚本的功夫。 ↩