几乎在任何涉及搜索的场景下,我们总是面临着两难处境:要么只能限于一个目标,要么就是往整个区域撒大网。对此问题并不敏感的读者,不妨设想一个场景:你面对着前手同事交来的流水档案,里面有几百个文件夹,你想要的材料可能在今年1月、2月、3月、4月、5月或6月这六个文件夹中;在多数文件搜索工具中,你要么逐一翻找这六个文件夹,要么直接在包含几百个文件夹的大资料夹里搜索。两者都不是好主意。
国外很早就有人 hack 过 macOS 的原生智能文件夹,并发现了线索,后来 Hum 在中文圈中较早发表了《同时在 Finder 里搜索几个指定文件夹里的文件》,我也发布了自己版本的自动化方案《如何在 Finder 中同时搜索多个文件夹(附自动化)》和原理不同的《让 LaunchBar 支持中文文件搜索》。
就文件级别的搜索而言,以上努力已经足够。但在 FoxTrot 这类更专业的亚文件级文件搜索工具中,问题转化成了:如何同时搜索多个文件?还原一下我的工作场景:我有几百本参考书,我依稀记得某个经典案例不是在去年某一期的杂志上,就是收录在某位学者的专著中,但在默认搜索方式中,我要么一本一本检索候选书籍,要么直接撒大网,然后再过滤无数的搜索结果。
指定复数个文件?甚至 FoxTrot 都不相信自己能轻松做到。1我也曾打算偃旗息鼓,直到我发现,其实答案已经隐藏在 FoxTrot 的搜索语法——准确说是正则表达式——中。而语法又暗示着自动化的可能性,我很快制作了 LaunchBar 和 Keyboard Maestro 版本的自动化动作,终于可以指定检索 FoxTrot 数据库中的任意复数个文件。
还有一个好消息:在打包封装后,你已经一劳永逸,不再需要反复输入本文即将展示的复杂语法。
从手工到语法
事情始于一个简单的信念:在 FoxTrot 这种高级工具中,如果你能用图形界面完成一件事,那么就有可能将其转化为机器更易读的语法,进而实现自动化。且听我一步一步说明。
我很早就意识到,FoxTrot 可以添加多组搜索条件,且之间的逻辑关系也可以自行设置,就多文件搜索而言,事情并不复杂:一方面,在默认条件组中正常搜索关键词;另一方面,添加一个只搜索文件名的条件组,填上你想搜索的所有文件名称。整个过程很像 Finder 的复杂条件搜索。2
假设我只想找 李建伟 公司诉讼类型化专题24讲(三).pdf
和 赵旭东 新公司法重点热点问题解读.pdf
两本书中的内容,那么我可以用一段正则表达式 "李建伟 公司诉讼类型化专题24讲(三).pdf"|"赵旭东 新公司法重点热点问题解读.pdf"
同时搜索两书。注意,此时已经有了语法化的端倪。
我们再引入两个事实。第一,FoxTrot 早已接轨了国际惯例,可以用空格连接多个关键词,此事姑且不足挂齿;另一件事才直达核心:文件名具有高度排他性——即便没有,你也可以,或者应该善加重命名,让它有——如果你输入文件名,那么你很可能只会搜到那本书。配合语法,就可以搜索多本指定的书。特别是在 FoxTrot 所索引的专业参考资料文件夹中,我很难想象谁会往里面丢“未命名.pdf”或“新建.doc”这类不明所以的鬼东西。
"李建伟 公司诉讼类型化专题24讲(三).pdf"|"赵旭东 新公司法重点热点问题解读.pdf" {69} "合伙" "对赌"
抽象之后,多文件搜索的语法形如下:
"文件名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,此时已经过滤出了目标文件,你只需接着输入其他关键词。我经常只需检索某几期的杂志,或只想看民法典司法解释配套的理解与适用书籍,此时我就会先挑出它们,避开无关参考资料。
第二种在 FoxTrot 内部使用,例如已经通过初步搜索确定了目标书籍后,可以进一步选定文件,接下来只深度挖掘制定文件的内容。
图中难以呈现搜索的完整过程,且恕我澄清:我的 FoxTrot 内部多文件搜索策略分两步,第一步用粗略的关键词找出相关文件(本质上是文件层级的搜索),第二步在挑选出的小范围文件中深度搜索(进入亚文件层级),此时需换用更精确的关键词,以精准找出相关页面甚至段落。
如果你更喜欢用 LaunchBar 浏览文件——一种不打开 Finder 的文件浏览方式3——也可以直接在 LaunchBar 导航或搜索结果列表中选定待搜索的文件。
至于其他的启动器,例如 Alfred 或 Raycast,只要它们没有整什么幺蛾子,老老实实提供正常格式的文件路径,理论上也可以挪用本文的 LaunchBar 方案。当然,这些功课,还是留给实际使用前述工具的人去做吧。
- 严格来说,FoxTrot 只承认自己只能索引整个文件夹,而不能索引复数个散落各处的文件,但是该贴子要解决的问题恰恰是多文件搜索,而 FoxTrot 官方给出的答案却是手动打标签,然后依托标签加以过滤。我有理由相信,FoxTrot 自己都不知道自己有多强大。 ↩
- 但很遗憾,Finder 支持嵌套条件,而 FoxTrot 似乎没有此选项。但这已超出本文讨论范围。 ↩
- 就此话题,可参阅《不打开文件夹的文件浏览思路》和《浏览文件信息的另一种轻量化思路(macOS)》等文章。 ↩