article_image

几乎在任何涉及搜索的场景下,我们总是面临着两难处境:要么只能限于一个目标,要么就是往整个区域撒大网。对此问题并不敏感的读者,不妨设想一个场景:你面对着前手同事交来的流水档案,里面有几百个文件夹,你想要的材料可能在今年1月、2月、3月、4月、5月或6月这六个文件夹中;在多数文件搜索工具中,你要么逐一翻找这六个文件夹,要么直接在包含几百个文件夹的大资料夹里搜索。两者都不是好主意。

国外很早就有人 hack 过 macOS 的原生智能文件夹,并发现了线索,后来 Hum 在中文圈中较早发表了《同时在 Finder 里搜索几个指定文件夹里的文件》,我也发布了自己版本的自动化方案《如何在 Finder 中同时搜索多个文件夹(附自动化)》和原理不同的《让 LaunchBar 支持中文文件搜索》

就文件级别的搜索而言,以上努力已经足够。但在 FoxTrot 这类更专业的亚文件级文件搜索工具中,问题转化成了:如何同时搜索多个文件?还原一下我的工作场景:我有几百本参考书,我依稀记得某个经典案例不是在去年某一期的杂志上,就是收录在某位学者的专著中,但在默认搜索方式中,我要么一本一本检索候选书籍,要么直接撒大网,然后再过滤无数的搜索结果。

指定复数个文件?甚至 FoxTrot 都不相信自己能轻松做到1我也曾打算偃旗息鼓,直到我发现,其实答案已经隐藏在 FoxTrot 的搜索语法——准确说是正则表达式——中。而语法又暗示着自动化的可能性,我很快制作了 LaunchBar 和 Keyboard Maestro 版本的自动化动作,终于可以指定检索 FoxTrot 数据库中的任意复数个文件。

Alt text
从 Finder 中指定多个文件,在 FoxTrot 中搜索它们

还有一个好消息:在打包封装后,你已经一劳永逸,不再需要反复输入本文即将展示的复杂语法。

从手工到语法

事情始于一个简单的信念:在 FoxTrot 这种高级工具中,如果你能用图形界面完成一件事,那么就有可能将其转化为机器更易读的语法,进而实现自动化。且听我一步一步说明。

我很早就意识到,FoxTrot 可以添加多组搜索条件,且之间的逻辑关系也可以自行设置,就多文件搜索而言,事情并不复杂:一方面,在默认条件组中正常搜索关键词;另一方面,添加一个只搜索文件名的条件组,填上你想搜索的所有文件名称。整个过程很像 Finder 的复杂条件搜索。2

Alt text
半图形化半语法的搜索

假设我只想找 李建伟 公司诉讼类型化专题24讲(三).pdf赵旭东 新公司法重点热点问题解读.pdf 两本书中的内容,那么我可以用一段正则表达式 "李建伟 公司诉讼类型化专题24讲(三).pdf"|"赵旭东 新公司法重点热点问题解读.pdf" 同时搜索两书。注意,此时已经有了语法化的端倪。

我们再引入两个事实。第一,FoxTrot 早已接轨了国际惯例,可以用空格连接多个关键词,此事姑且不足挂齿;另一件事才直达核心:文件名具有高度排他性——即便没有,你也可以,或者应该善加重命名,让它有——如果你输入文件名,那么你很可能只会搜到那本书。配合语法,就可以搜索多本指定的书。特别是在 FoxTrot 所索引的专业参考资料文件夹中,我很难想象谁会往里面丢“未命名.pdf”或“新建.doc”这类不明所以的鬼东西。

"李建伟 公司诉讼类型化专题24讲(三).pdf"|"赵旭东 新公司法重点热点问题解读.pdf" {69} "合伙" "对赌"
Alt text
完全语法化的搜索

抽象之后,多文件搜索的语法形如下:

"文件名A"|"文件名B"|"文件名C" 其他关键词

其中,连接 "文件名A""文件名B""文件名C" 的符号 | 表示逻辑或,匹配任一名称的文件都会被找到。而在文件名两侧加上英文直角双引号,则是为确保精确匹配,同时避免文件名中的空格破坏了 FoxTrot 语法,毕竟,未被引号包裹的空格会被当作逻辑和(AND)。

其他关键词 部分也可以包含其他语法,我习惯使用 {69} "关键词A" "关键词B",这表示仅搜索在 69 字符范围内同时出现 关键词A关键词B 的文件,以确保搜索结果具有较高相关性,略去那些在开头出现A、末尾才出现B的低相关性书籍。我提供的搜索模板也包含了前述语法——说白了就是懒得维护自己和对外老套版本——不喜欢的读者可参考 FoxTrot 进阶语法自行调整。

或许上述内容已经引发了部分读者的恐惧,但不必担心,因为语法化的下一步自然就是自动化。我们将完全略去输入语法的环节。

从语法到自动

至此,我们还需提到一个事实:FoxTrot 支持 AppleScript,你只要写好整段搜索语句,然后把它丢给 FoxTrot 就好;那么,自动化工具所做的,无非就是把文件转化为搜索语句,并提供给 FoxTrot。说到底,这只是字符串的排列组合以及格式转换,不值着墨,诸位只需知道,我们最后得到了两种多文件搜索方案。

第一种是直接在 Finder 中选定文件——显然,你需要先用 FoxTrot 索引过它们,索引机制是 FoxTrot 工作的第一前提——然后触发自动化动作,旋可移步 FoxTrot,此时已经过滤出了目标文件,你只需接着输入其他关键词。我经常只需检索某几期的杂志,或只想看民法典司法解释配套的理解与适用书籍,此时我就会先挑出它们,避开无关参考资料。

Alt text
从 Finder 中指定多个文件,在 FoxTrot 中搜索它们

第二种在 FoxTrot 内部使用,例如已经通过初步搜索确定了目标书籍后,可以进一步选定文件,接下来只深度挖掘制定文件的内容。

Alt text
从 FoxTrot 搜索结果中指定多个文件,继续搜索它们

图中难以呈现搜索的完整过程,且恕我澄清:我的 FoxTrot 内部多文件搜索策略分两步,第一步用粗略的关键词找出相关文件(本质上是文件层级的搜索),第二步在挑选出的小范围文件中深度搜索(进入亚文件层级),此时需换用更精确的关键词,以精准找出相关页面甚至段落。

如果你更喜欢用 LaunchBar 浏览文件——一种不打开 Finder 的文件浏览方式3——也可以直接在 LaunchBar 导航或搜索结果列表中选定待搜索的文件。

Alt text
从 LaunchBar 中选定多个文件,在 FoxTrot 中搜索它们

至于其他的启动器,例如 Alfred 或 Raycast,只要它们没有整什么幺蛾子,老老实实提供正常格式的文件路径,理论上也可以挪用本文的 LaunchBar 方案。当然,这些功课,还是留给实际使用前述工具的人去做吧。


  1. 严格来说,FoxTrot 只承认自己只能索引整个文件夹,而不能索引复数个散落各处的文件,但是该贴子要解决的问题恰恰是多文件搜索,而 FoxTrot 官方给出的答案却是手动打标签,然后依托标签加以过滤。我有理由相信,FoxTrot 自己都不知道自己有多强大。
  2. 但很遗憾,Finder 支持嵌套条件,而 FoxTrot 似乎没有此选项。但这已超出本文讨论范围。
  3. 就此话题,可参阅《不打开文件夹的文件浏览思路》《浏览文件信息的另一种轻量化思路(macOS)》等文章。

author_avatar

Lawyer, macOS/iOS Automation Amateur