未来已来,只是不均衡地分布在当下
大家好,我是菜农,欢迎来到我的频道。
本文共 2187字,预计阅读 10 分钟
用过 Linux 的小伙伴都知道,在Linux系统中包含着大量的文件,绝大部分情况下,我们都是通过 CLI 的方式与Linux进行交互,这就会面临一个问题,当我们需要查找一个文件的时候却迟迟无从下手,不知道该如何找起。
我们应该怎么查找文件呢?庞大的文件量如何查找自如了,这篇文章带你走进 Linux 的内部世界!
在本篇中我们将掌握
两款用于在系统中查找文件的工具
locate
:按照路径名查找文件find
:在目录中查找文件
三个配合查找工具来处理结果文件的命令
xargs
:通过标准输入构建并执行命令touch
:修改文件时间stat
:显示文件或文件系统状态
一、查找工具
1. locate
顾名思义,这是一款定位工具,用于简单的文件查找。它能对路径名执行快速的数据库查找(留意下,这里是 数据库 查找),然后输出与给定字符串匹配的各个名称。
场景1
系统中创建了一个 locate-file 文件,由于粗心忘记了文件所在路径,那该怎么办呢?通过
locate
命令
locate
命令会从 路径名数据库 中进行查找,输出所有包含字符串 locate-file 的匹配项。
场景2
难度升级,在系统的多个目录下都创建了 locate-file 文件,但只想要上级目录是 dir1 的文件,那该怎么办?通过
grep
命令
我们可以借助Linux系统中 **管道 | ** 的特性,利用 grep
来进行过滤。
不知道细心的小伙伴有没有注意到,上面几段文字中都提到了 数据库 这个关键词。我们利用 locate
再次进行查找:
两个步骤:
- 我们创建了 locate-file_bak 文件
- 我们利用
locate
进行查找
但我们却发现此时查找的结果为空!locate
难道失效了?其实不然,locate
命令在系统安装好之后是无法工作的,但如果我们过一天后再次进行尝试就会发现又恢复正常了。那是咋回事?是因为 locate
命令的数据库是通过另一个命令 updatedb
创建的。它通常利用 cron 定时任务进行作业,大多数包含 locate 命令的系统每天会执行一次 updatedb
命令,因此数据库并不是实时更新的,所以会出现上述的情况,创建文件后,数据库还没进行更新。
那么该如何解决该问题呢?
我们可以切换为超级用户,手动执行 updatedb
命令。
2. find
顾名思义,这也是一款定位工具,不同的是,该命令用户复杂的文件查找。find
命令可以根据各种属性在指定目录(及其子目录)中查找文件。
场景1
我们想要生成 testdir 目录中的文件列表,那该怎么办?通过
find
命令
对于相对较大的文件夹来说,该命令会产生一个很长的文件列表,我们可以利用 **管道 | ** 的特性进行二次处理。比如我们可以通过 wc
命令来统计文件数量。
find
命令的强大之处就是在于能够配合各种选项(option)、测试条件(test)以及操作(action)来找出符合特定条件的文件。
1)测试条件
假如我们只想要查找目录,我们便可以利用测试条件来实现。
通过加入测试条件 -type d
,限制只查找目录。相反,我们也可以使用下列测试条件,限制只查找普通文件
通过 type 可以来限制输出的文件类型,在 find
命令中支持以下文件类型:
- b: 块设备文件
- c: 字符设备文件
- d: 目录
- f: 普通文件
- l: 符号链接
当然,我们除了利用 -type
来限制文件的类型,我们还可以限制 文件名、文件大小 等,以下列出几点常见的测试条件:
- -size n: 匹配大小为 n 的文件
- -type n: 匹配类型为 n 的文件
- -name n: 匹配名称为 n 的文件
- -empty: 匹配空文件或目录
- -user name: 匹配属于用户 name 的文件或目录。name 可以使用用户名或数值形式的用户ID表示
如果想查看更完整的测试条件,可以使用 man find
来查看命令手册
2)操作符
在测试条件,find
指令已经相当完整了,但有些时候我们仍然需要一种更好的方式来描述测试条件之间的逻辑关系。
场景1
我想查找 testdir 目录下,命名为 dir2 和 dir3 的文件
这很明显是一种 或 的逻辑,使用 find
命令我们可以这样做:
在这一小段语句中我们使用到了两种逻辑关系:分别是 且(-and) 和 或(-or)
-and
可以省略,如果不嫌麻烦的话也可以这样写:
三个逻辑关系:与、或、非。介绍了前两种,第三种也不能落下:
通过指令可以看出,我们可以利用 -not
进行结果取反。
3)预定义操作
以上操作我们能够通过 find
命令来查找结果,但更多时候我们真正想做的是对结果执行某些特殊操作。
当我们想要删除 /Users/cbuc/testdir/dir2
这个目录时,我们可以通过以上认识到的操作先进行查找
然后使用 -delete
命令来删除当前匹配的文件
可以发现, /Users/cbuc/testdir/dir2
这个目录已经被删除了
除了删除操作,还可以进行以下几种常见的操作:
- -delete: 删除当前匹配的文件
- -ls: 对匹配的文件执行相当于 ls -dils 命令的操作
- -print: 将匹配文件的完整路径名输出至标准输出
- -quit: 一旦发现匹配就退出
敬畏生产环境:使用 -delete 之前,需要使用 -print 命令先确保查找结果无误。
4)自定义操作
除了预定义操作,我们还可以针对查找结果调用任意命令。传统的实现方式是通过 -exec
操作。
-exec command {};
这里的 command 特指命令名,{ } 是代表当前路径名的符号。; 作为分隔符,表示命令结束。比如我们之前使用的 -delete
命令可以使用自定义操作来替换。
-exec rm '{}' ';'
因为 { } 和 ; 对 shell 具有特殊的含义,所以必须对其进行标注或转义
我们借此来认识 xargs 命令,它从标准输入接收输入,将其转换为指定命令的参数列表。
其中,find
命令的输出结果通过管道传给了 xargs
命令,后者构造出 ls 命令的参数列表,然后执行该命令。
命令参数的数量不是没有限制的。有可能出现命令长度超出 Shell 接受能力的情况。如果出现了这种情况,xargs 命令可以使用系统支持的最大参数数量来执行指定的命令,然后重复此过程,直至处理完所有参数。在执行 xargs 命令时加入
--show-limits
选项就能知道系统支持的最大参数数量。
好了,以上便是本篇的所有内容,如果觉得对你有帮助的小伙伴不妨点个关注做个伴,便是对小菜最大的支持。不要空谈,不要贪懒,和小菜一起做个吹着牛X做架构
的程序猿吧~ 咱们下文再见!
今天的你多努力一点,明天的你就能少说一句求人的话!
我是小菜,一个和你一起变强的男人。
💋
微信公众号已开启,菜农曰,没关注的同学们记得关注哦!