article_image

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

但有一个例外。在关于文件管理的旧作中,我不得不为 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> 参数(如已有,则覆盖),表示没有任何预设条件。

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

  • 将 <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,即可在下载文件夹中获得一个智能文件夹,打开就能跨文件夹搜索。

Keyboard Maestro 动作下载(GitHub)

这个 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 版本的读者自己尝试。

🛍 我撰写的付费栏目《Keyboard Maestro 进阶指引》正在 UNTAG 售卖,详解 Keyboard Maestro Macro 高级设计思路,欢迎选购:付费内容链接

机器阅读:本文已开放全文。 标准阅读页 · Markdown


author_avatar

法律顾问,前律师, macOS/iOS 自动化业余玩家。有效即合法,无效的优雅有罪。