article_image

本文依赖 Spotlight Index,但在文件数量较多时,它可能并不可靠。文章成文较早,至发布之日,我早已拥抱 Unix 搜索命令 和专业搜索工具而彻底抛弃 Spotlight,显然也不再使用本文方案,但对于绝大多数 macOS 用户——文件数量可能远不如我多——而言,本文仍有价值。

macOS 的搜索机制如此完善,兼顾命令行、高级搜索语法、图形化搜索界面和智能文件夹,以至于几乎所有第三方工具引以为傲的搜索功能,基本只是在炒原生功能的冷饭,根本用不着冤枉钱。1

但有一个例外。在关于文件管理的旧作中,我不得不为 HoudahSpot 破例,因为它能够同时搜索多个文件夹,而这一功能正是 macOS 的阿喀琉斯。

不过,是时候宣布原生系统在文件搜索领域的彻底胜利:多文件夹搜索其实早有途径,答案就在智能文件夹(smart folder)中。

Alt text
用 Keyboard Maestro 一键创建多文件夹搜索的智能文件夹

何谓多文件夹搜索

注:本就奔着多文件夹搜索来的读者,可以跳过这一段。考虑到多文件夹搜索是一个边缘场景,多数人可能以为是吹毛求疵,故有必要举几个切身例子。

搜索者,划定范围,设置条件,仅此而已,如同在一个池子里下网捕鱼。几乎所有讨论都围绕搜索条件,却忽视了池子在哪儿——原生功能也不例外,仅仅提供搜索整台电脑和查找当前文件夹两个选项,不能同时搜索多个目标。由此带来的不便,例言之:鄙人写有一百来篇文章,未及发表,发现其中关于 Keyboard Maestro 几篇引用有误,于是检索关键词 来源文章(此为拟称),苟按 macOS 的规矩,要么在一百多篇文件中搜索,夹杂大量无关文件;要么逐个打开关于 Keyboard Maestro 话题的文件夹,一一搜索。无论何者,都近乎愚蠢。

Alt text
只想搜索几个指定的文件夹

换言之,当你明知目标文件可能在一个小范围内时,macOS 预设的两种搜索范围,不是过于宽广,就是太过局限。

除了临时一用,多文件夹搜索也可以固定为常驻的智能文件夹。我(根据下文方法)制作了一个汇集多文件夹近期 PDF 文件的智能文件夹,同时显示最近下载或导入的论文、文章和讨论,但是不展示厚重的书籍——这其实是多文件夹搜索的反向应用:选中其他,效果就相当于排除特定文件夹。

Alt text
做一个干净的“最近添加”文件夹

如何实现多文件夹搜索

多文件搜索基于智能文件夹,此“文件夹”实为保存好的一组搜索条件,可繁可简,日后用到时打开即可过滤文件,而无需重复输入搜索条件。需要澄清,多文件夹搜索并非我独创,曾有人研究过如何排除某个特定文件夹,Hum 也在《同时在 Finder 里搜索几个指定文件夹里的文件介绍了这一技术。相关讨论是本文方案的技术基础之一。

核心在于,陆续有人发现智能文件夹其实是一个纯文本文件,因而有直接修改其内容的可能,突破系统限制、任意划定搜索范围当然也有希望。让我们从零开始这段探索。首先建立一个智能文件夹:在任意一个文件夹中,按下 ‌⌘Command-F,然后就地保存它——不要输入任何搜索条件,以免掺入没有必要的参数。

Alt text
先随便创建一个智能文件夹

随后用文本编辑器打开刚刚创建的智能文件夹,可以看到,其本质上是一段 XML(Extensible Markup Language,可拓展标记语言)文本,其中记录了搜索的两大要素——范围条件。由于刚才没有输入任何条件,因此目前的条件参数几乎是一片空白,只有范围参数,而这正中下怀。

Alt text
智能文件夹其实是一段纯文本

仔细查看智能文件夹的代码后,可以发现其中有 3 处记录文件夹路径,此为突破点。早已有人发现了这些路径参数,并追加文件夹路径以实现多文件夹搜索,但其方案和更早的一样,很快纷纷失效,然后被归入“新系统下不 work”的奇技淫巧之列,非常可惜。事实上,前面提及的几个方案已经触及核心,只是漏了一些参数——除了需要追加文件路径外,还需要在下图中位置插入 <string>_kMDItemGroupId = 11</string> 参数(如已有,则覆盖),表示没有任何预设条件。2

总体上,需要下个如下五处:

  1. <key>RawQuery</key> 之下的一行修改为<string>_kMDItemGroupId = 11</string>
  2. 另一处 <key>RawQuery</key> 之下的一行,作同样修改;
  3. 在第一次出现路径的地方,换行后追加新文件夹路径,保持格式一致,开头的 /System/Volumes/Data/ 和两边的 <string> 也要保留;
  4. 在第二次出现路径的地方换行追加路径,保持格式一致,这次不需要 /System/Volumes/Datay/
  5. 在第三次出现路径的地方,和上一步同样作同样修改。
Alt text
修改后的智能文件夹代码(共五处,有一处屏幕空间不够无法显示)

随后保存修改,并打开智能文件夹。刚刚打开时可能已经有一些搜索结果在其中,可以发看到,此时已经实现了跨文件夹搜索。继续添加进一步的搜索条件,就可以更细致地过滤文件。

Alt text
修改后的智能文件夹即可同时搜索多处

自动化:用 Keyboard Maestro 同时搜索任意选中的文件夹

理所当然,除了第一次摸索外,我从来没有手动创建、修改过智能文件夹,毕竟这功夫可能重于挨个翻找文件夹——还不考虑写错代码前功尽弃的。可一旦想到智能文件夹本质只是一段纯文本,紧接着的自动化思路也就铺好了。我使用 Keyboard Maestro——大概所有自动化工具都可以,只是 Keyboard Maestro 最简单——将生成智能文件夹的流程打包好,每次使用时,只需选中任意多个文件夹,按下快捷键 ‌⌃Control-⌥Option-⌘Command-F3,即可在下载文件夹中获得一个智能文件夹,打开就能跨文件夹搜索。

Alt text
用 Keyboard Maestro 一键创建多文件夹搜索的智能文件夹

Keyboard Maestro 动作下载(GitHub)

这个 Keyboard Maestro 动作主要做了三件事:第一,预设一个跨文件夹搜索的智能文件夹模板;第二,从当前所选文件夹中获取其路径,并转换为智能文件夹所需的格式,再替换到模板里;第三,把替换好的纯文本保存为智能文件夹(换个后缀名就行)。

Alt text
把修改后的文件路径写入智能文件夹

至于在何处存放智能文件夹,我选择了下载文件夹,你可以修改“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 高级设计思路,欢迎选购:付费内容链接

Keyboard Maestro 进阶指引
Keyboard Maestro 进阶指引

  1. 这一批评,主要是基于绝大多数搜索工具都使用 Spotlight 索引这一现实,仅有凤毛麟角的软件不需要仰其鼻息——我能想到的(图形化工具)基本只有 EasyFind
  2. 严格意义上的没有预设条件是 false,但这么写会导致只能搜索参数中的第一个文件夹,因此我参照有效的智能文件夹修改了参数。该参数是绝大多数旧方案失效的原因——我甚至怀疑报错者从来就没有成功过,使用 false 的智能文件夹应当自始无效,而不是到最近的系统才出问题。
  3. 一般的搜索快捷键是 ‌⌘Command-F‌⌃Control-⌥Option-⌘Command-F 选择了同样的字母键,方便记忆,同时配合了一组不容易冲突的修饰键。
  4. 我一般只有非 Shortcuts 不可或者用 Shortcuts 更简单时,才会考虑它。比如和日历交互,显然原生的 Shortcuts 更方便;再如修改文件名乱码,Shortcuts 自带了编码解码模块,可以免去自己写脚本的功夫。

author_avatar

Lawyer, macOS/iOS Automation Amateur