如何在 Linux 中搜索多个文件中的文本

快速解答

搜索文本文件:使用 grep 或 ripgrep 搜索纯文本、代码、日志和配置文件。
搜索文档内容:使用桌面应用程序搜索 PDF、Word、Excel、LibreOffice 等文档。
想按名称查找文件:使用 find 或 locate。

 

我测试了大量 Linux 文件搜索命令和应用程序——远比本文介绍的更多——并从中选出了最实用、最有效的方法。我在 Ubuntu 上测试了文中的示例,并在整篇文章中使用了同一组 TXT、PDF、ODT、DOCX 及其他文件。

 

请先使用下表选择合适的方法,然后阅读对应的部分。

 

 

您应该使用哪种 Linux 搜索方法?

 

最佳方法主要取决于您需要搜索的文件类型。

 

任务 最佳选项
使用标准 Linux 命令搜索文本文件 grep
快速搜索大型文件夹中的文本文件 ripgrep
按文件名而非内容查找文件 find 或 locate
搜索 PDF、Word、LibreOffice、Excel 及其他文档的内容 SeekFast
使用免费的开源索引式文档搜索工具 Recoll 或 DocFetcher

 

grep 和 ripgrep 工具搜索文本文件的内容,而 find 和 locate 则搜索文件名和路径。这些工具非常适合技术类文件,但无法可靠地搜索复杂文档格式的内容。因此,面对装满文档的文件夹与装满日志或代码的文件夹时,正确的解决方案并不相同。

 

 

使用 grep 命令搜索文件中的文本

 

grep 命令是 Linux 中用于查找文件内文本的标准工具。它最适合搜索纯文本、源代码、日志、CSV 文件、Markdown 文件和配置文件。

 

要在当前文件夹的 .txt 文件中搜索某个单词,请使用:

grep "budget" *.txt

 

要搜索某个文件夹及其所有子文件夹,请使用递归搜索:

grep -R "budget" ~/Documents/stories

 

实际使用时,我通常会添加行号和文件名,因为这样能让结果更易于使用:

grep -RIn "budget" ~/Documents/stories

 

以下是各选项的含义:

  • -R 递归搜索文件夹。
  • -I 跳过二进制文件。
  • -n 显示行号。
Recursive grep search for budget in text files on Linux, with an arrow highlighting the command

 

不区分大小写搜索

要忽略大小写差异,请添加 -i:

grep -RIn -i "report" ~/Documents/stories

 

这样可以找到 "report"、"Report" 和 "REPORT"。

 

仅搜索完整单词

要匹配完整单词,请添加 -w:

grep -RIn -w "policy" ~/Documents/stories

 

这样可以避免匹配 "policyholder" 等更长单词中的内容。

 

仅搜索特定文件类型

要仅搜索具有特定扩展名的文件,请使用 --include:

grep -RIn --include="*.txt" "budget" ~/Documents/stories

 

对于多个扩展名,请重复使用该选项:

grep -RIn --include="*.txt" --include="*.md" "budget" ~/Documents/stories

 

如果文件夹包含多种文件类型,而您只想搜索基于文本的文件,这会很有用。

 

从搜索中排除文件夹

大型文件夹通常包含您不想搜索的目录,例如 archive、drafts 或备份目录。您可以像下面这样排除它们:

grep -RIn --exclude-dir="archive" --exclude-dir="drafts" "risk" ~/Documents/stories

 

这样可以让结果更简洁,并可能大幅提高搜索速度。

 

搜索精确短语或多个字符串

要搜索精确短语,请将短语放在引号中:

grep -RIn "sales report" ~/Documents/stories

 

要搜索多个字符串中的任意一个,请为每个字符串添加一个 -e 选项:

grep -RIn -e "sales" -e "budget" -e "payment" ~/Documents/stories

 

您还可以通过 -E 使用扩展正则表达式:

grep -RInE "customer|product|service" ~/Documents/stories

 

这两个命令都会匹配至少包含一个字符串的行。如果您需要查找同时包含 "sales" 和 "payment" 的文件,即使它们位于不同行,也可以分两步筛选文件名:

grep -RIlZ "sales" ~/Documents/stories | xargs -0 -r grep -Il "payment"

grep search for sales, budget, and payment with file and directory filters on Linux

以上是 grep 命令最常见的用法。有关完整参考信息,请参阅 GNU grep 手册。

 

grep 无法满足需求的情况

grep 命令功能强大,但它仍然是一种纯文本搜索工具。它通常适用于以可读文本形式存储的文件,但并不适合作为搜索 Word 文档、Excel 电子表格、LibreOffice 文件、PDF、电子书或其他文档格式的通用解决方案。

 

如果尝试对包含各种文档的文件夹使用 grep,您往往会漏掉重要匹配项或得到无法阅读的输出。遇到这些情况,请直接查看文档搜索工具。

 

 

使用 ripgrep 更快地进行命令行搜索

 

ripgrep 通常以 rg 命令运行,是一种现代命令行搜索工具。官方 ripgrep 指南说明,它默认会递归搜索目录并应用自动筛选。对于大型代码和文本文件夹中的递归搜索,它通常比标准 grep 更快。

 

要搜索当前文件夹及其子文件夹,请使用:

rg "budget"

 

要搜索特定文件夹:

rg "budget" ~/Documents/stories

 

要仅搜索特定文件类型:

rg "budget" -g "*.txt" ~/Documents/stories

 

ripgrep 默认还会遵循 .gitignore,这对源代码项目很有帮助,因为它会自动跳过许多生成的文件或无关文件。

 

搜索代码、日志、Markdown、配置文件或其他纯文本时,请使用 ripgrep。对于 PDF、Word、LibreOffice、Excel 及其他文档,请改用文档搜索工具。

ripgrep search for sales, marketing, and customer in a Linux folder

 

应该使用哪个:grep 还是 ripgrep?

这两个工具都能搜索纯文本内容,但适合的工作流程略有不同:

  • 如果您需要一个几乎所有 Linux 系统都已自带的标准命令,请使用 grep。
  • 如果您需要在代码仓库和大型文本文件夹中进行快速递归搜索,请使用 ripgrep。
  • ripgrep 默认搜索子文件夹并遵循 .gitignore,而 grep 命令需要递归选项;除非您主动排除路径,否则它会进行更直接的搜索。
  • 对于 PDF、Word、Excel、LibreOffice 及其他复杂文档格式,请使用文档搜索工具,而不是这两个命令。

 

如何在 Ubuntu、Mint、Fedora、Debian 及其他 Linux 发行版上安装 ripgrep

ripgrep 搜索命令在各 Linux 发行版上都相同,只有安装命令会因软件包管理器而异。以下命令遵循官方 ripgrep 安装说明。

 

发行版 安装 ripgrep
Ubuntu、Linux Mint、Debian sudo apt install ripgrep
Fedora sudo dnf install ripgrep
openSUSE sudo zypper install ripgrep
Arch Linux sudo pacman -S ripgrep

 

 

在 Linux 中按名称查找文件和目录

 

如果您知道完整文件名或文件名的一部分,请使用 find 命令。GNU Findutils 手册介绍了它的文件名、时间、大小及其他筛选条件。此命令不会搜索文件中存储的文本;如需搜索文本,请使用 grep 或 ripgrep。

 

要在 stories 文件夹及其子文件夹中查找名称包含特定单词的文件,请使用:

find ~/Documents/stories -type f -iname "*profit*"

 

使用 -iname 进行不区分大小写的部分匹配:

find ~/Documents/stories -type f -iname "*shopping*"

 

星号会匹配 "shopping" 前后的任意字符。要查找目录而非文件,请将 -type f 改为 -type d:

find ~/Documents/stories -type d -iname "*archive*"

 

您还可以按扩展名、修改日期或大小筛选文件:

find ~/Documents/stories -type f -iname "*.pdf"

find ~/Documents/stories -type f -mtime -7

find ~/Documents/stories -type f -size +100M

 

这些命令分别查找 PDF 文件、大约最近七天内修改的文件,以及大于 100 MB 的文件。

 

使用 locate 更快地查找文件

locate 命令搜索文件名数据库,而不是每次都扫描文件系统,因此按文件名查找通常比使用 find 快得多。plocate 手册说明了这种索引式查找的工作原理:

locate -i "profit"

 

由于 locate 使用索引,最近创建的文件可能要等数据库更新后才会出现。在您有权刷新数据库的系统上,请使用:

sudo updatedb

 

如果需要最新结果或详细筛选条件,请使用 find。如果希望以最快的方式在已索引的位置中查找现有文件名,请使用 locate。

Comparison of find and locate commands for filenames containing profit on Linux

 

各种 Linux 搜索方法实际搜索的内容不同工具会搜索文件的不同层面。
Four searchable layers in Linux with find, locate, grep, ripgrep, SeekFast, Recoll, DocFetcher, and ChatGPT

 

适用于 Linux 的最佳文档搜索工具

 

grep 和 ripgrep 工具专为纯文本而设计。要搜索 PDF、Word、Excel、LibreOffice、电子书及其他格式,请使用下面的一种文档搜索应用程序;仅包含图像的扫描版 PDF 需要先进行 OCR。

 

如果您想搜索包含不同文档类型的文件夹、预览匹配的句子,并在不使用终端的情况下查看按相关性排序的结果,SeekFast 非常合适。当您需要搜索新的文件夹或内容经常变化的文件夹时,它尤其方便。

 

如果您偏好免费的开源软件,并且愿意提前创建索引,Recoll 和 DocFetcher 都是不错的选择。建立索引需要进行一些准备,但可以让您更方便地在已有文档集合中反复搜索。

 

ChatGPT 桌面应用程序采用了不同的方法。它可以处理您选择的文件夹、回答自然语言问题、比较文件并总结发现。当您需要理解信息而不是仅仅进行穷尽式精确匹配搜索时,它最适合作为补充工具使用。

 

 

SeekFast

 

SeekFast 是一款适用于 Windows、macOS 和 Linux 的文档搜索工具。它专为搜索大型文档集合的内容而设计,而不是仅通过终端搜索纯文本文件。

 

它的主要优势是使用方便。您只需选择文件夹、输入搜索词,就可以在打开各个文件之前看到匹配的句子。如果您不知道确切的文件名,并且需要搜索大量文档的内容,这会非常有用。

SeekFast search for company and sales across PDF, TXT, and DOCX files on Linux

当文件夹中包含多种文档类型时,SeekFast 尤其有用,因为它可以搜索多种格式的内容,并按相关性对结果排序。这使它比传统的精确匹配文件搜索更接近网络搜索体验。

 

主要功能包括:

  • 文档搜索 - 搜索超过 120 种受支持的文件格式,包括 PDF、Word、LibreOffice、Excel、文本文件和电子书。
  • 匹配句子预览 - 在打开文件之前查看相关文本。
  • 按相关性排序的结果 - 匹配程度更高的文件会显示在结果中的更靠前位置。
  • 多关键词搜索 - 即使单词并不相邻,也能找到相关文档。
  • 图形化工作流程 - 无需为常见文档搜索任务编写终端命令。

 

优点

  • 搜索包含实际文档的文件夹时,比 grep 方便得多。
  • 当您记得文档中的某些词,却不记得文件名时非常有效。
  • 显示上下文,因此您可以在打开文件之前评估结果。
  • 适用于包含 PDF、Office、LibreOffice、文本及其他格式的混合文件夹。

 

缺点

  • SeekFast 免费版每次最多只能搜索 50 个文件。
  • 它并非用于取代 grep 或 ripgrep 进行源代码搜索。
  • 它不支持专业命令行工具那样的高级正则表达式工作流程。

 

如果您的主要任务是搜索大量文档的内容,而不是搜索代码或日志文件,请下载 SeekFast,并选择您的一个文档文件夹进行试用。

 

 

Recoll

 

Recoll 是一款适用于 Linux 及其他类 Unix 系统的免费开源桌面搜索工具。它使用索引,这意味着它会先扫描您选择的文件夹,然后让您快速进行搜索。

Recoll search results for business across TXT, PDF, and DOCX files on Linux

对某些文档格式的支持取决于系统中安装的辅助应用程序。如果您想要一款开源的索引式桌面搜索工具,并且不介意花些时间进行配置,它是一个不错的选择。

 

优点

  • 免费且开源。
  • 作为索引式 Linux 桌面搜索工具,表现良好。
  • 安装适当的辅助程序后,可以搜索多种文档格式。

 

缺点

  • 初始索引和配置可能需要一些时间。
  • 对于普通用户,其工作流程可能显得较为复杂。
  • 文档格式支持可能取决于已安装的系统软件包。

 

 

DocFetcher

 

DocFetcher 是一款适用于 Linux、Windows 和 macOS 的免费开源桌面搜索应用程序。DocFetcher Pro 是提供额外功能的独立付费版本。与 Recoll 一样,它通过为您选择的文件夹创建索引来工作。

DocFetcher search results for business with a matching document preview on Linux

DocFetcher 支持 PDF、Microsoft Office、OpenDocument、HTML 和纯文本等常见文档格式。如果您想要一款免费的跨平台工具,并且愿意在搜索前创建索引,它会很有用。

 

优点

  • 标准版 DocFetcher 免费且开源。
  • 适用于 Linux、Windows 和 macOS。
  • 可以显示已索引文档的文本预览。

 

缺点

  • 必须先创建索引,才能搜索文件夹内容。
  • 其界面看起来比许多现代搜索工具更陈旧。
  • 如果您经常临时搜索文件夹,又不想提前创建索引,使用起来不太方便。

 

 

 

ChatGPT 桌面应用程序已针对受支持的 Linux 发行版推出预览版。它不是传统的文件搜索程序,而是一个可以处理您所选文件夹中文件的 AI 工作区。

 

要将其用于本地文件,请在 ChatGPT Work 或 Codex 中打开本地文件夹,并授予其访问您想使用的文件的权限。随后,您可以使用自然语言提问,例如:

  • “查找讨论业务风险的文档。”
  • “比较销售报告,并显示最重要的差异。”
  • “查找与此项目相关的信息并进行总结。”
Codex in the ChatGPT desktop app summarizing business risks from local files on Linux

当您不记得确切措辞时,这种方法最为有用。ChatGPT 可以帮助您按含义搜索、关联多个文件中的信息、总结搜索结果并进行解释。Codex 还可以搜索和分析源代码项目。

 

优点

  • 可接受自然语言问题,而不仅限于关键词或正则表达式。
  • 可以总结、比较和解读多个文件中的信息。
  • 当下一步是理解结果,而不仅仅是定位某个短语时,它非常有用。

 

缺点

  • 它并非旨在保证找到每个精确匹配项,因此当完整性至关重要时,请使用 grep 或 ripgrep。
  • 它不提供 SeekFast、Recoll 或 DocFetcher 那样专门的索引式搜索工作流程。
  • Linux 版本仍处于预览阶段,官方仅支持部分发行版。
  • 它需要 ChatGPT 账户并使用在线服务,而不是完全离线运行。在将其用于敏感文档之前,请查看 OpenAI 如何使用 ChatGPT 和 Codex 数据,并评估您的隐私要求。

 

请将 ChatGPT 作为传统搜索工具的补充:grep 和 ripgrep 更适合精确文本搜索;文档搜索应用程序更适合以可预测的结果浏览文档集合;当您希望理解、比较或总结所找到的信息时,ChatGPT 会很有用。

 

 

总结

 

在本文中,我分享了在测试中最适合用于在 Linux 上查找文件和搜索文件内容的方法。不过,Linux 用户通常都有自己偏爱的工具和工作流程。您使用哪种方法?我是否遗漏了某个实用的命令或应用程序?

 

您可以通过以下任一方式分享您的经验:

 

 

常见问题

 

1. 如何在 Linux 中按名称查找文件?
使用 find 命令。例如:

find ~/Documents/stories -type f -iname "*profit*"

此命令会在 stories 文件夹及其子文件夹中搜索文件名包含 "profit" 的文件,并且不区分大小写。

 

2. find 和 grep 有什么区别?
find 命令搜索文件名、路径和文件属性。grep 命令搜索纯文本文件中存储的文本。如果您知道文件名,请使用 find;如果您记得文件中的某些词,请使用 grep 或文档搜索工具。

 

3. 应该使用 find 还是 locate?
如果需要最新结果和详细筛选条件,请使用 find。如果希望通过预先创建的索引更快地查找文件名,请使用 locate。新创建的文件可能要等 locate 的数据库更新后才会出现。

 

4. 如何搜索 Linux 文件夹中所有文件的文本?
grep -R 命令是标准选择。例如:

grep -RIn "budget" ~/Documents/stories

这最适合纯文本文件、源代码、日志和配置文件。

 

5. 如何同时搜索子文件夹?
使用 grep -R 进行递归搜索:

grep -RIn "budget" ~/Documents/stories

此命令会搜索 stories 文件夹及其子文件夹,跳过二进制文件,并显示行号。

 

6. 如何仅搜索特定文件类型?
使用 --include。例如:

grep -RIn --include="*.txt" "budget" ~/Documents/stories

对于多个扩展名,您可以重复使用 --include。

 

7. 如何从 grep 搜索中排除文件夹?
使用 --exclude-dir。例如:

grep -RIn --exclude-dir="archive" --exclude-dir="drafts" "risk" ~/Documents/stories

 

8. 如何搜索多个可能出现的单词?
为每个字符串添加一个 -e 选项。例如:

grep -RIn -e "sales" -e "budget" -e "payment" ~/Documents/stories

此命令会查找包含任意一个字符串的行。

 

9. ripgrep 比 grep 更好吗?
在大型代码和文本文件夹中进行递归搜索时,ripgrep 通常更快、更方便;而 grep 命令几乎默认存在于所有 Linux 系统中,非常适合普通文本搜索。两者都不是通用文档搜索工具。

 

10. 为什么 grep 找不到 PDF 或 Word 文件中的文本?
grep 命令专为纯文本设计。PDF、Word、LibreOffice 和 Excel 文件以更复杂的格式存储文本,因此 grep 可能会漏掉匹配项或显示无法阅读的输出。请使用文档搜索工具搜索这些文件。

 

11. 在 Linux 上搜索 PDF、Word 和 LibreOffice 文件内容的最佳方法是什么?
请使用能够识别文档格式的搜索工具。如果您需要预览和按相关性排序的结果,SeekFast 使用起来很方便。如果您偏好索引式桌面搜索,Recoll 和 DocFetcher 是不错的开源替代方案。

 

12. SeekFast 可以在 Linux 上运行吗?
可以。SeekFast 提供 Linux 版本,并且可以通过图形界面搜索多种文档格式的内容。

 

13. 应该使用 grep、ripgrep 还是 SeekFast?
使用 grep 进行普通纯文本搜索。使用 ripgrep 在代码和文本文件夹中进行快速递归搜索。需要搜索 PDF、Word、LibreOffice、Excel 及其他文档的内容并查看预览时,请使用 SeekFast。

关于作者
Dimitar Stamenov 是一位常驻保加利亚索非亚的软件开发者和企业家。他毕业于 Sofia University,自 2002 年起一直从事专业软件开发工作。他是 Slaviana Soft 的创始人、经理兼首席开发者,也是 SeekFast 的创建者。他长期参与的其他项目包括 Preslav ERP 和 SEORanks。Dimitar 曾在 Telerik Academy 和 Software University 讲授软件相关课程和 SEO。在为 SeekFast 博客撰稿时,他会亲自测试所介绍的软件和命令,并结合自己每周帮助用户解决实际问题的工作经验。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注