一、开发环境介绍

本文使用VMware虚拟机,运行Ubuntu 18.04.1 LTS版本。使用的Linux内核版本为4.15.0。建立ssh远程连接,通过Xshell操作虚拟机。
另外,使用的shell脚本为bash。

二、Linux shell中find的作用

在shell中输入 $ man find 可以得到帮助手册对于find命令的解释:“search for files in a directory hierarchy”,即在目录层次结构中查找文件。这就必须要提一下Linux的虚拟文件系统(Virtual file system,VFS)

作为用户与文件系统之间的中间层,VFS将文件以树型结构呈现给用户,而find命令在层次遍历树型结构的过程中查找符号条件的文件。

2.对于find参数的解释

Linux manual给出的find命令格式为

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]

1)参数 [-P] 表示是默认行为,当find检查或打印信息时,对于软链接文件,所使用的信息应取自软链接文件本身。

2)与参数 [-P] 对应的是参数 [-L] ,加入 [-P] 参数后,当find检查或打印有关文件的信息时,使用的信息取自链接指向的文件的属性,而非链接本身。
3)参数 [H] 表示当命令行指定的参数为一符号链接时,解析该链接。检查打印等其余情况都不进行符号解析。
4)参数 [-D debugopts] 是关于Debug信息的,与平时使用关系不大,基本可以忽略。
5) [-Olevel] 参数表示对find的优化等级。同样在平时使用中不常用。

3.find按名字查找 -name

-name 实现 find 命令的按名字查找。
一个简单的例子是寻找示例文件 file1

$ find . -name "file1"

结果如下:
find按名字查找的一个例子
首先我们利用 $ pwd命令显示当前工作目录,可以看到我们当前处于home目录下,find后面的参数 . 表示以当前目录为starting-point,进行层次遍历并查找file1。查找后得到file1的路径位于 ./derical/file1 ,同样的,这里的 **.**表示当前工作目录,它实际上是一个目录(directory)文件,与目录文件home以硬链接方式指向一片内存区域。因此file1的路径既可以写作 /home/derical/file1 也可以写作 ./derical/file1

-name 之后的字符串可以通过通配符填充。

下面介绍三种通配符:

1)星号 *
  星号通配符可以取代任何字符串,包括空串。
比如下面这两个例子:
在这里插入图片描述
在这里插入图片描述
2) 问号?
  问号用于取代单个字符。
在这里插入图片描述
3) 左右括号[]
  左右括号用于取代[]括出来集合中的单个字符
在这里插入图片描述
此外[]可以用来表示两个集合的交集
如下图所示:
在这里插入图片描述
此外还应该注意的是,[]只能用于替代集合中的一位字符
下图中的第二种写法是一种错误的示范,11-99会被视为ascii码,因此搜索不到想要的结果
在这里插入图片描述


4.find按用户信息查找 -user/-uid/-group/-gid

共有四种用户信息,分别对应参数:
用户名        -user
用户ID        -uid
组名         -group
组ID         -gid

对应的代码为:

$ find . -user derical
$ find . -uid 1000
$ find . -group derical
$ find . -gid 1000


5.find按权限查找 -perm

  要了解如何按权限查找,就得先了解Linux文件权限是如何管理的
  调用ls指令显示当前工作目录中文件的详细信息
在这里插入图片描述
我们需要关注的是第一列信息。
以文件dir1为例,其第一列信息为drwxrwxr-x,其中’d’表示其为目录文件(directory),而file文件对应位置的信息是’-’,表示其为普通文件。
r表示read,代表用户对该文件拥有读权限,w表示write,代表用户对该文件拥有写权限,x表示execute,代表用户对该文件拥有执行权限,
rwxrwxr-x 九个字母每三个字母对应一类用户的权限,自左到右分别对应本用户、同组的其他用户、其他用户。
以下面的代码为例讲解find命令如何实现按权限查找。

$ find . -perm 777

文件的权限以类似位图的形式来存储,用户的文件权限有r、w、x三种,用户类型有用户、同组其他用户、其他用户三种,将三类权限三种用户按顺序组合成9位2进制数就能表示文件的所有用户权限,为读写方便,将9位2进制数改为3位8进制数。
因此将777由八进制数写作二进制数111111111,对应三类用户的三类权限,即rwxrwxrwx,搜索结果为三类用户都能进行读写执行的文件。

6.find按文件大小查找 -size

  需要注意的是,在计算文件大小时,Linux采用rounding up,即向上取整的原则。此外,find -size后跟的文件大小参数单位默认为block。
举几个例子:

$ find . -size 8

表示搜索文件大小为8个磁盘块大小的文件

$ find . -size 8c

表示搜索文件大小为8个字节大小的文件

此外 -size 还支持 +-,分别表示大于/小于指定大小的文件

$ find . -size +8c			//搜索文件大小大于8字节的文件
$ find . -size -8c			//搜索文件大小小于8字节的文件

另有

$ find . -empty

表示搜索大小为0的文件或目录

7.find按文件类型查找 -type

  在第五栏,find按权限查找中已经介绍为文件的两种类型,‘d’代表directory,表示目录文件,’-'表示普通文件。
  此外,Linux文件系统中还有:
  b    block(buffered)special
  c    character(buffered)special
  d    directory
  p    named pipe
  f    regular file
  l    symbolic link
  s    socket

相应的,只要在 -type命令后面加上对应的文件类型即可
如:

$ find . -type -
$ find . -type d
$ find . -type p

8.find按时间查找 -amin/-atime等

  按时间查找有三种类型:
  access 访问时间 对应缩写a
  modify 修改时间 对应缩写m
  status change 状态(名字、权限)等修改时间 对应缩写c
因此,有以下参数:-amin/-atime、-mmin/-mtime、-cmin/-ctime。
举个例子:

$ find . -amin n		//查找n分钟以前被访问过的所有文件
$ find . -atime n		//查找n天以前被访问过的所有文件

-size 一样,-atime后面的参数也可以用 +- 修饰

$ find . -mmin +n		//查找n分钟以前被修改过的所有文件
$ find . -mmin -n		//查找n分钟之内被修改过的所有文件

9.find命令的集合运算

Linux find参数中有
-a 表示求两个条件的交集
-o 表示求两个条件的并集
! 表示求条件的补集
举例如下:

$ find . -type f -o -type d				//查找普通文件和目录文件
$ find . ! -type f		        		//查找非目录文件
$ find . -name "*html" -a -size +100b	//查找后缀名为html且大于100字节的文件

The end.
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐