一文揭晓,我是如何在 Linux 中查找自如
用过 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)来找出符合特定条件的文件。
更多 C++后台开发技术点知识内容包括 C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,音视频开发,Linux 内核,TCP/IP,协程,DPDK 多个高级知识点。
C/C++Linux服务器开发高级架构师/C++后台开发架构师免费学习地址
【文章福利】另外还整理一些C++后台开发架构师 相关学习资料,面试题,教学视频,以及学习路线图,免费分享有需要的可以点击领取
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 操作。
这里的 command 特指命令名, { } 是代表当前路径名的符号。 ; 作为分隔符,表示命令结束。比如我们之前使用的 -delete 命令可以使用自定义操作来替换。
因为 { } 和 ; 对 shell 具有特殊的含义,所以必须对其进行标注或转义
我们借此来认识 xargs 命令,它从标准输入接收输入,将其转换为指定命令的参数列表。
其中,find 命令的输出结果通过管道传给了 xargs 命令,后者构造出 ls 命令的参数列表,然后执行该命令。
命令参数的数量不是没有限制的。有可能出现命令长度超出 Shell 接受能力的情况。如果出现了这种情况,xargs 命令可以使用系统支持的最大参数数量来执行指定的命令,然后重复此过程,直至处理完所有参数。在执行 xargs 命令时加入 --show-limits 选项就能知道系统支持的最大参数数量。
原文链接:一文揭晓,我是如何在 Linux 中查找自如 - 掘金
评论