# 为什么，以及如何深度搜索 DEVONthink 文件清单内的所有文件

> 本文公开全文。

原文：https://utgd.net/article/20537

文件搜索工具有两大原罪，第一是分明照搬了 Spotlight 索引，却背后一刀、痛批Spotlight，属于精神分裂；第二则是一味打磨搜索技巧，却无视搜索范围，导致搜索结果不是太宽就是太窄，纯属有勇无谋。

我在 DEVONthink 中管理文件，虽然避开了第一类软件，但仍然躲不开第二类无的放矢的情况。于是我自己编写了一套脚本，可以调用强大的预装搜索工具 grep，精确检索一份文件清单中的所有文件，且支持全文检索、高亮关键词和进阶语法。

\>\>GitHub 资源下载\<\<

## 使用前提：文件清单

这套方案想要用着舒服，前提是您有列清单——无论书单、阅读清单或参考资料清单——的习惯。如果你没有这一习惯，那么本文方案对你来说可能显得大动干戈，甚至看上去愚不可及。

为什么要列清单？在文件管理中，我们已经有文件夹和标签管理等维度，但对于任何一个严肃对待资料的人而言，清单仍然不可或缺。参考一下卡片笔记的使用方法就知道，很多人会创建所谓的 MoC（Map of Content，内容地图），这就是一种清单，把相关笔记列在一个单子里，方便查询。清单的逻辑很简单：就像下棋一样，记住了所有的基础规则，但是你肯定还要记住一些模式，每次都是从这些模式下手，而不会真的从基本规则开始演绎。对于记笔记来说，清单体现了笔记中的某种模式；而对于文件管理来说，清单同样是秩序的索引。

例言之，我曾参与某个关于有限公司重组的案件，为此收集了一批法律法规，后来我又遇到了另一个相似的案件，只是这次从普通公司变成了国有企业，那我就需要另外整理一份参考资料清单。两份清单中的文件大同小异，如果使用传统文件夹，就会遇到一个文件不知往何处放的困境；而标签，虽然灵活得多，却也远不如清单直观。在清单中，我可以手动排序、分类，把参考资料按来源或者重要程度排列组合，这样一眼看上去就知道谁轻谁重，类似的事情不是说标签做不到，而是极其麻烦。何况这还只是两个案子，如果以后做的事情更多，用到的清单也只会只多不少。

试想两个办事员，一个维护了很多清单，看上去好像互相之间有很多重叠，似乎不够geek，但他总能够在一秒钟之内就拿出所有相关资料；而另一个人熟练掌握文件夹标签双向链接高级搜索过滤法以及人工智能搜索引擎等一系列技术，每次噼里啪啦一顿敲键盘——我觉得所有读者都能够看出来谁先会被开除。

清单就是那种土到掉渣，但是极其有效的整理技术。

## 如何批量检索一份清单中的文件

我在 DEVONthink 里维护了很多资料清单，要用的时候就按图索骥，而不需要从零开始思考相关资料有哪些。但是仅仅按图索骥还不够，我想进一步知道这匹马是什么品种，血统高低，习性如何？清单本身只是列出了文件名，但不会告诉我文件的详细内容。传统操作流程是先用清单缩小搜索范围，然后再逐个点开有可能派上用场的文件。这样一来不方便，二来很可能漏查一些信息，因此我设计了下面的批量检索方案，只需要输入一次关键词，就可以搜索清单中列出的所有文件。

首先需要维护一份文件清单。为方便叙述，本文默认这些文件是 Markdown 格式，其他类型的文件只要找到对应的搜索工具，同样可以处理（比如搜 PDF 可以用 pdfgrep）。文件清单的具体格式您可以自由发挥，只要其中包含了item link这一关键信息。你可以右键 DEVONthink 中的任何一个文件，然后拷贝它 item link。除了用于本文的搜索脚本，item link 在日常也很有用，只需要点一下就能查看原始文件，并且移动或者重命名文件也不影响链接，因此即便不是为了以后批量搜索，也很推荐使用 item link。

我比较习惯清单格式的 Markdown 链接，这样在 DEVONthink 之外，只要一个软件能够识别 Markdown，那就可以用来浏览清单。而 Obsidian 或 Logseq 还可以折叠大纲，即便文件清单很长，浏览起来也比较方便。

随后是确定您习惯的搜索方式。我比较推荐使用 grep 命令，本文也以它为例，因为它可以全文搜索多个文件，然后把搜索结果一字排开，并且高亮突出关键词，这些功能要是碰上商业软件，基本上每一项都是天价收费点。当然，每一台电脑上都已经预装了 grep，所以各位不用花钱。还是啰唆一句，本文默认只处理纯文本文件，如果要搜索 PDF，你需要换别的工具；至于 Office 之类的封闭格式，恕我对此毫无头绪，也没有兴趣。

接下来我们先完整运行一遍搜索脚本。使用方法非常傻瓜式：

- 需要选中一份文件清单，在检查器（Inspector）中找到链接（link）选项卡，按下 ‌⌘Command\-A 全选其中的链接；

- 运行脚本，输入关键词；

- 稍等几秒，就可以在终端中看到搜索结果。

如图所示，清单中的每一项文件都被仔仔细细搜索了一遍，所有的搜索结果展示在一处，并且关键词还被显眼的红色标了出来。这些搜索效果都是 grep 的功劳。

知识点：认识 grep 命令

grep 是一个经典的 Linux 命令，常用于查找文件中符合要求的字符串，可以同时搜索多个文件，还能和正则表达式配合使用，同时作为命令行工具，它还很容易写进脚本，和各种自动化工具配合。我不会展开太深，这里仅仅解释一下本文用到的命令：

```
grep -E -r --color=auto "文件" "文件"
```

其中，\-E 参数表示使用正则表达式，\-r 意味着递归搜索，均提供给有一定基础的读者，平时用不到的话也不用在意；\-\-color=auto 表示高亮搜索关键词，截图中红色高亮字体的效果就要归功于这一参数。grep 默认会输出包含关键词的整行文本，这正中下怀，因此我没有进一步修改其他参数。

考虑到某些文件名带有空格或特殊符号，在使用 grep 命令时最好将文件路径整个用英文双引号 "" 包裹起来，以免识别错误。不过本文的文件路径由 AppleScript 自动生成，默认就有引号包裹，因此无需进一步操作。

搜索脚本的原理并不难理解。在维护文件清单时，我提到不可或缺的只有文件链接，因为搜索脚本需要检查文件链接，然后确定具体的搜索范围。只是有些可惜，DEVONthink 并不能通过文件链接直接判断文件所在的位置，所以我写了一个比较蠢的循环脚本，先把文件链接还原为文件夹路径，再组合成 grep 所需的命令，如果文件清单非常长，这可能会让脚本耗时多两三秒。

我在《DEVONthink 脚本入门：以导出 Markdown 格式阅读清单为例》里介绍了 DEVONthink 脚本的几种运行方式，你可以给本文的脚本绑定一个快捷键，方便使用。

## 小结

可能有读者会问，为什么要使用外部搜索工具，而不直接使用 DEVONthink 本身？第一个理由很干脆，那就是 DEVONthink 的中文搜索基本不能用，其分词断句机制极糟。有个笑话说，空姐问乘客“鸡和牛两种套餐饭，要吃哪种”，结果乘客回答，吃和牛（这是一种高级的牛肉）。在检索中文文档时，DEVONthink 一天可以犯一千个这样的笑话，直到你再也笑不出来。

第二个理由则比较积极。许多第三方搜索工具，本来就很强大，比如本文使用的 grep 就特别适合精确、批量检索纯文本，尤其是它可以直接显示正文内的对应段落，这一功能很多文件管理工具都做不到（包括 DEVONthink）。

事实上，我并非从一开始就直奔 DEVONthink 加 grep 的组合而去，而是从另一款非常小众的检索工具 FoxTrot 中得到启发。FoxTrot 是专业文件搜索工具，其特色功能之一就是创建自定义索引，这类似于文件清单，可以把搜索目标限定在一小簇文件中。因此我设计了一个从 DEVONthink 文件清单出发的搜索方式，在第三方工具展开深度搜索。

另外，BBEdit 等编辑器倒是可以多文件检索，但并不走文件清单的路径，单说搜索或许也是一条捷径，但没了朴素的清单，总觉的和文件之间少了一层历史（log，志），似也不忍割去。

🛍 我撰写的付费栏目《信息管理，文件为本位的方案》正在 UNTAG 售卖，对本文话题有进一步讨论，欢迎选购：付费内容链接

---

[前往标准阅读页](https://utgd.net/article/20537?audience=web)
