如何在 Linux 中以递归方式查找文件

作为 Linux 系统管理员或高级用户,知道如何查找深埋在目录结构中的文件是一项基本技能。与仅触及表面的 GUI 搜索工具不同,命令行方法支持通过子目录递归搜索以精确定位文件而不管其位置如何。这允许快速定位错误放置的文档,识别要清理的大型未使用文件,解决由问题文件引起的问题以及各种其他用例

terminal-linux-logo-3

了解此布局可以创建更好的搜索条件并预测文件位置。例如,日志文件通常位于 /var/log 下,配置文件位于 /etc 下用户文档通常位于 /home 下。此上下文大大缩小了搜索区域

从这个角度来看,现在让我们看看如何利用命令行工具来搜索这个结构。

使用find

用于递归文件搜索的最通用和最广泛使用的命令是 find。它通过目录树进行搜索,以根据指定的条件匹配文件

基本用法find

find 的语法非常简单:

find [starting/root directory] [options] [expression]

若要演示基本用法,请考虑搜索名为 database 的文件TXT公司在 /home 下

$ find /home -name database.txt
/home/meilana/Documents/database.txt

在这里,/home 定义了要递归搜索的根目录。-name 选项根据给定的模式(即数据库)检查文件名TXT公司

可以指定多个名称模式来搜索多个文件。

$ find /var/log -name *.log -o -name *.txt

这将在 /var/log 中搜索以 结尾的路径日志 或 .TXT公司-o 参数组合了名称检查。

这些简单示例展示了 find 如何在没有任何通配符的情况下按名称/路径查找文件。但是添加通配符使搜索查询更加灵活。

使用通配符进行模式匹配

通配符是与字符串的未知部分匹配的特殊字符。在文件搜索中使用它们可以指定模式而不是固定名称,从而大大增强了匹配范围。 以下是常见的通配符及其用途:

  • *– 匹配零个或多个字符
  •  – 匹配任何单个字符
  • []– 匹配括号内的任何字符

例如,要查找 /var/log 下的所有日志文件, 而不考虑名称

$ find /var/log -name *.log

* 替换实际文件名,匹配 前面的任何字符序列日志

同样,查找以错误开头并以某种顺序结尾的文件:

$ find /home -name "error*"

此处 * 充当通配符,用于匹配错误后面的任何字符

另一个例子 - 将配置文件与任何扩展名匹配:

$ find /etc -name "config.*"

.* 组合允许点和扩展名发生变化。

[ ] 括号匹配定义集中的任意单个字符。例如,要查找 以 AB 或 C 为起始字符日志/txt 文件:

$ find /var/logs -name "[ABC]*.log" -o -name "[ABC]*.txt"

这显示了通配符如何与其他条件结合使用,以实现非常具体的匹配。

不区分大小写的搜索

默认情况下,find 以不同的方式处理大写字母和小写字母。若要使搜索不区分大小写,请使用 -iname 选项而不是 -name

例如,以下匹配 logLogLOG 或任何大小写变体:

$ find /tmp -iname "*.log"

当确切情况不确定时,这会派上用场。

按文件类型搜索

有时,我们可能对特定的文件类型感兴趣,而不是名称模式。-type 选项在这里有所帮助:

find . -type [f/d/l]

它允许指定文件类型——f 表示常规文件,d 表示目录,l 表示符号链接。

例如,查找 /usr/share 下的所有目录

$ find /usr/share -type d

这将查找忽略其他文件类型的子目录。

合并搜索条件

到目前为止看到的所有选项都可以组合起来创建复杂的搜索过滤器。像 AND/OR 这样的逻辑运算符有助于组合多个条件。

例如,要查找 JPG  GIF 图像文件:

$ find /home -type f \( -name "*.jpg" -o -name "*.gif" \)

这里 -o 充当 OR 条件,而括号 () 将这些条件分组以 应用带有 -type f 的 AND

同样,可以使用 NO 执行独占搜索

$ find /usr/bin ! -type d -a ! -type l

这仅返回 /usr/bin 下的常规文件,不包括目录和链接。-a 指定 AND NOT 条件。

这种布尔逻辑允许根据需要制作灵活的搜索过滤器。

限制搜索深度

不受限制的递归搜索最终可能会在树中遍历太多级别,从而导致处理时间过长。

Find 提供了限制深度的选项 – -maxdepth 限制了要探索的深度,而 -mindepth 设置匹配前的最小深度。

例如,仅在 /etc 下搜索前 3 个级别

$ find /etc -maxdepth 3 -type f

或者排除顶级目录本身:

这将跳过 /home 并仅匹配其子目录。

调整深度可以更快地搜索相关位置。

对匹配文件执行操作

虽然基本搜索有助于查找文件,但真正的力量在于能够处理这些结果。

-exec 选项通过将匹配的文件作为参数传递来帮助执行任何命令。例如,将找到的文件复制到另一个位置:

$ find . -type f -name "*.txt" -exec cp {} /tmp \;

此处 {} 表示匹配文件的列表。命令替换 ; 表示结束。

递归文件搜索的替代工具

“查找”命令使制作和自定义搜索的细节变得容易。但是,在某些情况下,shell 替代品可以派上用场,以满足更简单的需求。

用于搜索文件内容的 grep

在查找检查文件名和元数据时,grep 命令可以搜索文件中的文本模式 。使用 -r/-R 递归标志可将操作扩展到目录。

例如,要查找包含文本错误的所有文件

$ grep -r "error" /var/log

或者对特定文件类型使用不区分大小写的搜索:

$ grep -Ri "timeout" /etc/*.conf

这有助于通过内容而不是名称来跟踪错误、代码、配置设置等。

定位以进行快速文件名搜索

locate 命令通过在中央数据库中查找条目来提供极快的搜索。updatedb 进程会定期扫描文件并编制索引,以保持此缓存刷新。

搜索查询此文件名数据库,而不是遍历实际目录。例如:

$ locate -i "document.pdf"

这样可以立即查找文档,而无需爬网整个系统。但是,updatedb 每天只运行一次,因此最近添加的文件不会显示。

Find 最适合可以接受某些过时的快速搜索。

使用树直观地浏览目录

tree 命令以缩进的类似树的格式打印目录内容,以显示嵌套结构。将它与 grep 结合使用,可突出显示直接在视觉输出中匹配的文件和文件夹。

例如,在 路径或名称中显示所有具有缓存的位置:

$ tree / | grep "cache"

这样可以快速直观地看到匹配文件所在的位置。

优化递归搜索的性能

虽然非常有用,但广泛的递归搜索可能会给文件系统带来沉重的负担,尤其是在大型目录树上。 一些最佳做法有助于防止性能问题:

  • 收紧搜索范围:避免在大型目录上使用松散的条件,例如 -name “*”。修剪搜索区域和深度。
  • 排除不相关的位置:忽略不匹配的二进制目录和临时目录。
  • 首先搜索文件元数据locate 和 find -prune 等技术可最大程度地减少完整目录遍历。
  • 限制输出音量:追加 | 头只看到前几场比赛,而不是数千场比赛。
  • 不错的价值调整:降低使用 nice 或 ionice 的长查找作业的优先级,以减少影响。
  • 并行化搜索:利用并行和 xargs 等工具对工作进行多线程化。
  • 监控系统运行状况:密切关注 CPU、I/O 和 RAM 使用情况以检测问题。

调整这些因素可防止搜索作业使系统不堪重负。

本指南介绍了使用命令行工具在 Linux 上递归查找文件的各种方法和注意事项。具体来说,它探索了通用的查找命令及其用于制作搜索的一系列选项。我们还讨论了 grep 和 locate 等替代工具。考虑到递归搜索的资源需求,还突出显示了性能最佳实践。

对于 Linux 管理员和高级用户来说,开发这些技术的专业知识对于保持扩展文件系统的井井有条是非常宝贵的。强大的文件搜索功能为楼宇自动化脚本奠定了基础,用于管理配置、部署应用程序、处理日志等。

下一步是广泛练习这些命令。设置一些虚拟目录树,创建与不同深度的不同模式匹配的示例文件,并尝试搜索它们。逐渐提高复杂性,直到这些工具成为第二天性。这将灌输在 Linux 系统中精确定位任何文件的信心,无论文件有多深。

未经允许不得转载:统信UOS之家 » 如何在 Linux 中以递归方式查找文件

相关文章