0%

Linux 的 find 命令

Linux 之 find 命令

find命令用来在指定目录下查找文件,功能相当之强大。

官方定义为:

find - search for files in a directory hierarchy

Linux的哲学是一切皆文件,那么find的使命就是一切皆可查

语法

使用语法为:

1
$ find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

比较常用的几个参数为:

  • -exec <执行指令>:假设find指令的回传值为True,就执行该指令;
  • -size <文件大小>:查找符合指定的文件大小的文件;
  • -mtime <24小时>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
    -name<范本样式>:指定字符串作为寻找文件或目录的范本样式;
  • -type <文件类型>:只寻找符合指定的文件类型的文件;

无参数

如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件,并且将查找到的子目录和文件全部进行显示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ ls -l
total 310M
-rw-rw-r-- 1 user user 10M Mar 21 20:01 a
drwxrwxr-x 2 user user 22 Mar 21 20:01 aa
-rw-rw-r-- 1 user user 100M Mar 21 20:01 b
-rw-rw-r-- 1 user user 200M Mar 21 20:01 c


$ find
.
./a
./b
./c
./test

查找小于,等于和大于100MB的文件

通过-size大小来查找文件

1
2
3
4
5
6
7
8
9
10
$ find . -size -100M
.
./a
./aa
$ find . -size 100M
./b
$ find . -size +100M
./c
./aa/d

查找多长时间修改过

可以通过参数-mtime来查找文件的修改时间,比如如下可以查找当前目录下最近60天没有被修改的文件。

1
2
3
4
$ find . -mtime +60

# 最近2天以内未修改
$ find . –mtime -2

稍微复杂但是很有用的命令

我经常把 find 命令和他的选项 exec一起使用,比如我想查找一个目录中的所有文件并将其更改其权限。可以通过以下简单命令完成:

1
$ find /path/ -type f -exec chmod 644 {} \;

这个命令会递归搜索指定目录内/path/下的所有文件,并对找到的文件执行 chmod 命令。

一个搜索文件的好例子是:

1
# find /home/user -type f

这个命令会搜索 /home/user 目录下的所有文件。find 命令真的很强大,你可以传递更多选项给它使得你的搜索更加详细。如果你想搜索超过特定大小的文件,可以使用:

1
# find . -type f -size 10M

上面的命令会搜索当前目录中所有大于 10M 的文件。确保不要在你 Linux 系统的根目录运行该命令,因为这可能导致你的机器 I/O 瓶颈。

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
-amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;
-anewer<参考文件或目录>:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
-atime<24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算;
-cmin<分钟>:查找在指定时间之时被更改过的文件或目录;
-cnewer<参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-ctime<24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算;
-daystart:从本日开始计算时间;
-depth:从指定目录下最深层的子目录开始查找;
-expty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录;

-false:将find指令的回传值皆设为False;
-fls<列表文件>:此参数的效果和指定ls参数类似,但会把结果保存为指定的列表文件;
-follow:排除符号连接;
-fprint<列表文件>:此参数的效果和指定-print参数类似,但会把结果保存成指定的列表文件;
-fprint0<列表文件>:此参数的效果和指定-print0参数类似,但会把结果保存成指定的列表文件;
-fprintf<列表文件><输出格式>:此参数的效果和指定-printf参数类似,但会把结果保存成指定的列表文件;
-fstype<文件系统类型>:只寻找该文件系统类型下的文件或目录;
-gid<群组识别码&gt;:查找符合指定之群组识别码的文件或目录;
-group<群组名称>:查找符合指定之群组名称的文件或目录;
-ilname<范本样式>:此参数的效果和指定-lname参数类似,但忽略字符大小写的差别;
-iname<范本样式>:此参数的效果和指定-name参数类似,但忽略字符大小写的差别;
-inum<inode编号>:查找符合指定的inode编号的文件或目录;
-ipath<范本样式>:此参数的效果和指定-path参数类似,但忽略字符大小写的差别;
-iregex<范本样式>:此参数的效果和指定-regexe参数类似,但忽略字符大小写的差别;
-links<连接数目>:查找符合指定的硬连接数目的文件或目录;
-iname<范本样式>:指定字符串作为寻找符号连接的范本样式;
-ls:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出;
-maxdepth<目录层级>:设置最大目录层级;
-mindepth<目录层级>:设置最小目录层级;
-mmin<分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算;
-mount:此参数的效果和指定-xdev相同;

-newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-nogroup:找出不属于本地主机群组识别码的文件或目录;
-noleaf:不去考虑目录至少需拥有两个硬连接存在;
-nouser:找出不属于本地主机用户识别码的文件或目录;
-ok<执行指令>:此参数的效果和指定-exec类似,但在执行指令之前会先询问用户,若回答y或Y,则放弃执行命令;
-path<范本样式>:指定字符串作为寻找目录的范本样式;
-perm<权限数值>:查找符合指定的权限数值的文件或目录;
-print:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有&ldquo;./&rdquo;字符串;
-print0:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行;
-printf<输出格式>:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定;
-prune:不寻找字符串作为寻找文件或目录的范本样式;
-regex<范本样式>:指定字符串作为寻找文件或目录的范本样式;

-true:将find指令的回传值皆设为True;

-uid<用户识别码>:查找符合指定的用户识别码的文件或目录;
-used<日数>:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算;
-user<拥有者名称>:查找符和指定的拥有者名称的文件或目录;
-xdev:将范围局限在先行的文件系统中;
-xtype<文件类型>:此参数的效果和指定type参数类似,差别在于它针对符号连接检查。

如何查找在最近几天没有被修改过的文件?

下面这条命令会列出在当前目录下在最近60天没有被修改过文件

# find . -mtime +60

如何查找在最近几天被修改的文件?

下面这条命令会列出在当前目录下在最近2天被修改过文件

# find . –mtime -2

所以+-可以查找未被修改和修改过的文件。

如何删除目录/home/aaa/test中扩展名为.tar.gz并且大于100M的压缩文件?

先来一个例子:

我想查找后缀为tar.gz的,大于100M的文件,并详细查看,可以使用

find /home/aaa/test -type f -name *.tar.gz -size +100M -exec ls -l {} ;

find / home/aaa/test -type f -name *.tar.gz -size +100M -exec rm -f {} ;

find

◦find [搜索范围] [匹配条件]

◦1. find /etc –name passwd

◦2.

◦3. find / -user yourname

◦4. find / -amin/-cmin/-mmin

–amin – access访问时间 –

cmin – change 文件属性

–mmin – modify 文件内容

◦ 5. find / -type f/d/l 文件/目录/软链接

locate

◦locate filename

◦/var/lib/mlocate/mlocate.db && updated

which && whereis 查找命令

在home目录查找以.txt结尾的文件名

1
find /home -name "*.txt"

在home目录查找以.txt结尾的文件名,但是忽略大小写

1
find /home -iname "*.txt"

在home目录查找以.txt和.pdf结尾的文件名,但是忽略大小写

1
find /home -name "*.txt" -o -name ".pdf"

匹配文件路径或者文件

1
find . -path "*path*"

否定参数

找出home目录下不是以.txt结尾的文件

1
find /home ! -name "*.txt"

根据文件类型进行搜索

1
find . -type 类型参数

其中类型参数如下:

  • f 普通文件
  • l 符号链接
  • d 目录
  • c 字符设备
  • b 块设备
  • s 套接字
  • p FIFO

在home目录查找以.txt结尾的文件名,但是忽略大小写

向下最大深度限制为3

1
find . -maxdepth 3 -type f

根据文件时间戳进行搜索

1
find . -type f 时间戳

每个文件都有3个时间戳

  1. 访问时间 -atime 天 -amin 分钟 :用户最后一次访问时间
  2. 修改时间 -mtime 天 -mmin 分钟 :文件最后一次修改时间
  3. 变化时间 -ctime 天 -cmin 分钟 :文件数据元(如权限)最后一次修改时间

搜索最近7天内访问过的文件

1
find . -type f -atime -7

搜索恰好7天访问过的文件

1
find . -type f -atime 7

搜索超过7天内访问过的文件

1
find . -type f -atime +7
处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道