48小时系统班试听入口

【运维实用技术】Find命令的使用和解析

发布作者:新盟教育 发布日期:2022-10-13 浏览人数:4617人

运维实用技术

WX20221013-204201@2x.png


1、基本语法

find+[路径]+[参数] 
-name           #文件名
-not            #非,取反
-user           #文件所有人
-group          #文件所有组
-a              #并且关系
-o              #或者关系


2、基本参数的使用

name-按照文件名查找:

[root@localhost ~]# find /etc/ -name ifcfg-ens33
/etc/sysconfig/network-scripts/ifcfg-ens33

user-按文件的所有人查找:

[root@localhost ~]# find /home -user root
/home

group-按文件的所有组查找:

[root@localhost ~]# find /mnt -group westos
/mnt/file2
/mnt/file3


a表示并且:

and:逻辑与,在命令中用“-a”表示,是系统缺省的选项,表示只有当所给的条件都满足时,寻找条件才算满足。

默认不加任何参数也是表示并且:

#基本使用链接多个筛选条件
[root@localhost ~]# find /mnt -user root -a -group westos
/mnt/file2
#/home目录及子目录下查找所有以.txt和.pdf结尾的文件.
find /home \( -name "*.txt" -o -name "*.pdf" \)
或
find /home -name "*.txt" -o -name "*.pdf"
#匹配文件路径或者文件,路径名符合local的文件
find /usr/ -path "*local*"
#匹配tmp或hhh*的所有文件
#or:逻辑或,在命令中用“-o”表示。该运算符表示只要所给的条件中有一个满足 时,寻找条件就算满足。例如:
find –name ’tmp’ –o –name ’hhh*’


o表示或者:

or:逻辑或,在命令中用“-o”表示。该运算符表示只要所给的条件中有一个满足 时,寻找条件就算满足。

find –name ’tmp’ –o –name ’hhh*’


[root@localhost ~]# find /mnt -user root -o -group westos
/mnt
/mnt/file2
/mnt/file3
/mnt/file4
/mnt/file5


not-表示非,即反向选择。

否定not:逻辑非,在命令中用“!”表示。该运算符表示查找不满足所给条件的文件 。

例如:

#找出/home下不是以.txt结尾的文件
find /home ! -name "*.txt"
[root@localhost ~]# find /mnt -not -user student 
/mnt
/mnt/file2
/mnt/file4
/mnt/file5


3、常用参数

按文件所在的深度(层次)查找:

maxdepth和mindepth


按文件所在的深度(层次)查找:

-maxdepth       #最大深度 
-mindepth       #最小深度

举例说明:

##-maxdepth表示最大深度,即最多层次
[root@localhost ~]# find /etc/ -maxdepth 1 -name passwd
/etc/passwd
[root@localhost ~]# find /etc/ -maxdepth 2 -name passwd
/etc/passwd
/etc/pam.d/passwd
[root@localhost ~]# 
##-mindepth表示最小深度,即最少层次
[root@localhost ~]# find /etc/ -mindepth 2 -name passwd
/etc/pam.d/passwd
[root@localhost ~]# find /etc/ -mindepth 1 -name passwd
/etc/passwd
/etc/pam.d/passwd


表示文件大小(size):

size的说明:

#等于大于小于的表示
-size  20K      # 查找大小为20K的文件
-size  -20K     # -表示小于;查找比20K小的文件
-size  +20k     # +表示大于;查看比20K大的文件
#文件大小单元:
b —— 块(512字节)
c —— 字节
w —— 字(2字节)
k —— 千字节
M —— 兆字节
G —— 吉字节


用法举例:

#查找/mnt目录下文件大小为20k的文件
[root@localhost mnt]# find /mnt/ -size 20k  
/mnt/file2
##查找/mnt目录下比20k小的文件
[root@localhost mnt]# find /mnt/ -size -20k
/mnt/
/mnt/file1
##查找/mnt目录下比20k大的文件
[root@localhost mnt]# find /mnt/ -size +20k
/mnt/file3
#搜索大于10KB的文件
find . -type f -size +10k
#搜索小于10KB的文件
find . -type f -size -10k
#搜索等于10KB的文件
find . -type f -size 10k


type文件类型:

主要的文件类型:
     f        #普通文件
     d        #目录
     b        #块设备
     s        #套接字
     c        #字符设备
     l        #链接
     p        #管道


按文件类型查找:

##f表示普通文件
[root@localhost ~]# find /dev -type f
/dev/shm/pulse-shm-620843697
/dev/shm/pulse-shm-1247103260
/dev/shm/pulse-shm-2690706600
/dev/shm/pulse-shm-368331657
##b表示块设备
[root@localhost ~]# find /dev -type b
/dev/dm-0
/dev/sr0
/dev/vdb1
/dev/vdb
/dev/vda1
/dev/vda
##s表示套接字
[root@localhost ~]# find /dev -type s
/dev/log
##p表示管道
[root@localhost ~]# find /dev -type p
/dev/initctl
[root@localhost ~]# find /mnt -type f
/mnt/file1
/mnt/file3
/mnt/file2
##d表示目录
[root@localhost ~]# find /mnt -type d
/mnt


perm表示权限:

-perm  444       #查找文件权限
-perm  -444      # -表示并且;查找文件权限中u位有r权限,并且g位有r权限,并且o位有r权限的文件
-perm  /444      # /表示或者;查找文件权限中u位有r权限,或者g位有r权限,或者o位有r权限的文件
-perm  /777      # 777=rwx rwx rwx 即9个条件中满足任意一个即可


按文件权限查找:

##查找文件权限为404的文件
[root@localhost mnt]# find /mnt -perm 404
/mnt/file2
##查看文件权限中u位有r权限,并且o位有r权限的文件
[root@localhost mnt]# find /mnt -perm -404
/mnt
/mnt/file1
/mnt/file2
##查看文件权限中u位有r权限,或者o位有r权限的文件
[root@localhost mnt]# find /mnt -perm /404
/mnt
/mnt/file1
/mnt/file2
/mnt/file3
[root@localhost mnt]# ll -d /mnt/
drwxr-xr-x. 2 root root 42 Nov 14 09:41 /mnt/


基于文件时间戳:

find . -type f 时间戳
#UNIX/Linux文件系统每个文件都有三种时间戳:
#访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
#修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
#变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。


#搜索最近七天内被访问过的所有文件
find . -type f -atime -7
#搜索恰好在七天前被访问过的所有文件
find . -type f -atime 7
#搜索超过七天内被访问过的所有文件
find . -type f -atime +7
#搜索访问时间超过10分钟的所有文件
find . -type f -amin +10
#找出比file.log修改时间更长的所有文件
find . -type f -newer file.log


借助-exec选项及其他命令结合:

-exec:对搜索的结构指令指定的shell命令。注意格式要正确:

-exec 命令 {};


在}和\之间一定要有空格才行;

{}表示命令的参数即为所找到的文件;命令的末尾必须以“ ;”结束。

#在root以及子目录查找不包括目录/root/bin的,greek用户的,文件类型为普通文件的,3天之前的名为test-find.c的文件,并将结构输出,find命令如下:
find / -name "test-find.c" -type f -mtime +3 -user greek -prune /root/bin -print
#对上述例子搜索出来的文件进行删除操作,命令如下:
find / -name "test-find.c" -type f -mtime +3 -user greek -prune /root/bin -exec rm {} \; 
#查找当前目录中所有以main开头的文件,并显示这些文件的内容。 
find . - name ‘main*’ - exec more {} \;


#删除当前目录下所有一周之内没有被访问过的a .out或*.o文件 find . \(- name a.out - o - name ‘*.o’\)> - atime +7 - exec rm {} \;


此条指令解释:

  • 命令中的“.”表示当前目录,此时 find 将从当前目录开始,逐个在其子目录中查找满足后面指定条件的文件。

  • “(” 和 “)” 表示括号(),其中的 “\” 称为转义符。之所以这样写是由于对 Shell 而言,(和)另有不同的含义,而不是这里的用于组合条件的用途。

  • “-name a.out” 是指要查找名为a.out的文件。

  • “-name ‘*.o’” 是指要查找所有名字以 .o 结尾的文件。

  • 这两个 -name 之间的 -o 表示逻辑或(or),即查找名字为a.out或名字以 .o结尾的文件。

  • find命令在当前目录及其子目录下找到这佯的文件之后,再进行判断,看其最后访问时间 是否在7天以前(条件 -atime +7),若是,则对该文件执行命令 rm(-exec rm {} \;)。

  • 其中 {} 代表当前查到的符合条件的文件名,;则是语法所要求的。

  • 上述命令中第一行的最后一个 \ 是续行符。当命令太长而在一行写不下时,可输入一个 \,之后系统将显示一个 >,指示用户继续输入命令。


基于正则表达式匹配文件路径:

find . -regex ".*\(\.txt\|\.pdf\)$"
#同上,但忽略大小写
find . -iregex ".*\(\.txt\|\.pdf\)$"


删除匹配文件:

#删除/data下所有.txt文件
find /data -type f -name "*.txt" -delete


4、场景实例解析

#找出当前目录下所有root的文件,并把所有权更改为用户tom
find .-type f -user root -exec chown tom {} \;
#上例中,{} 用于与-exec选项结合使用来匹配所有文件,然后会被替换为相应的文件名。
#找出自己家目录下所有的.txt文件并删除
find $HOME/. -name "*.txt" -ok rm {} \;
#上例中,-ok和-exec行为一样,不过它会给出提示,是否执行相应的操作。
#查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中
find . -type f -name "*.txt" -exec cat {} \;> all.txt
#将30天前的.log文件移动到old目录中
find . -type f -mtime +30 -name "*.log" -exec cp {} old \;
#找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来
find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;
#因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令
-exec ./text.sh {} \;


搜索但跳出指定目录:

#查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk
find . -path "./sk" -prune -o -name "*.txt" -print


长度为零的文件:

#列出所有长度为零的文件
find . -empty


删除大日志文件:

服务器磁盘满,一般由大的日志文件导致,需找到大文件并删除。

 find / -size +500M -print0|xargs -0 du -m|sort -nr
#find指令为找出500M以上的文件,print0和xargs -0配合使用,用来解决文件名中有空格或特殊字符问题。du -m是查看这些文件的大小,并以m为单位显示。最后sort -nr是按照数字反向排序(大的文件在前)
或者
#上述方法从根路径查找,可能列出一些系统文件。可以在这个查找之前先进行一下过滤。
#使用du -m -d 1 /|sort -nr  先看看根路径下,哪个文件夹比较大
#并且有嫌疑是导致磁盘满的罪魁祸首。然后再基于那个目录进行find。


模糊查找:

#写过一个xxx.c的文件,但是忘了放哪里了
find / -name *xxx*.c 模糊查找下这个文件


其他实例:

#在root以及子目录查找不包括目录/root/bin的,greek用户的,文件类型为普通文件的,3天之前的名为test-find.c的文件,并将结构输出,find命令如下:
find / -name "test-find.c" -type f -mtime +3 -user greek -prune /root/bin -print
#将目前目录及其子目录下所有延伸档名是 c 的文件列出来。
find . -name "*.c"
#将目前目录其其下子目录中所有一般文件列出
find . -type f
#将目前目录及其子目录下所有最近 20 天内更新过的文件列出
find . -ctime -20
#查找/var/log目录中更改时间在7日以前的普通文件,并在删除之前询问它们:
find /var/log -type f -mtime +7 -ok rm {} \;
#查找前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件:
 find . -type f -perm 644 -exec ls -l {} \;
#为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径:
find / -type f -size 0 -exec ls -l {} \;


5、完整选项及参考来源

-amin:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;
-anewer:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
-atime:查找在指定时间曾被存取过的文件或目录,单位以24小时计算;
-cmin:查找在指定时间之时被更改过的文件或目录;
-cnewer查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-ctime:查找在指定时间之时被更改的文件或目录,单位以24小时计算;
-daystart:从本日开始计算时间;
-depth:从指定目录下最深层的子目录开始查找;
-empty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录;
-exec:假设find指令的回传值为True,就执行该指令;
-false:将find指令的回传值皆设为False;
-fls:此参数的效果和指定“-ls”参数类似,但会把结果保存为指定的列表文件;
-follow:排除符号连接;
-fprint:此参数的效果和指定“-print”参数类似,但会把结果保存成指定的列表文件;
-fprint0:此参数的效果和指定“-print0”参数类似,但会把结果保存成指定的列表文件;
-fprintf:此参数的效果和指定“-printf”参数类似,但会把结果保存成指定的列表文件;
-fstype:只寻找该文件系统类型下的文件或目录;
-gid:查找符合指定之群组识别码的文件或目录;
-group:查找符合指定之群组名称的文件或目录;
-help或——help:在线帮助;
-ilname:此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别;
-iname:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别;
-inum:查找符合指定的inode编号的文件或目录;
-ipath:此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别;
-iregex:此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别;
-links:查找符合指定的硬连接数目的文件或目录;
-iname:指定字符串作为寻找符号连接的范本样式;
-ls:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出;
-maxdepth:设置最大目录层级;
-mindepth:设置最小目录层级;
-mmin:查找在指定时间曾被更改过的文件或目录,单位以分钟计算;
-mount:此参数的效果和指定“-xdev”相同;
-mtime:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
-name:指定字符串作为寻找文件或目录的范本样式;
-newer:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-nogroup:找出不属于本地主机群组识别码的文件或目录;
-noleaf:不去考虑目录至少需拥有两个硬连接存在;
-nouser:找出不属于本地主机用户识别码的文件或目录;
-ok:此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令;
-path:指定字符串作为寻找目录的范本样式;
-perm:查找符合指定的权限数值的文件或目录;
-print:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有“./”字符串;
-print0:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行;
-printf:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定;
-prune:不寻找字符串作为寻找文件或目录的范本样式;
-regex:指定字符串作为寻找文件或目录的范本样式;
-size:查找符合指定的文件大小的文件;
-true:将find指令的回传值皆设为True;
-type:只寻找符合指定的文件类型的文件;
-uid:查找符合指定的用户识别码的文件或目录;
-used:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算;
-user:查找符和指定的拥有者名称的文件或目录;
-version或——version:显示版本信息;
-xdev:将范围局限在先行的文件系统中;
-xtype:此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查。


1、基本语法

find+[路径]+[参数] 
-name           #文件名
-not            #非,取反
-user           #文件所有人
-group          #文件所有组
-a              #并且关系
-o              #或者关系


2、基本参数的使用

name-按照文件名查找:

[root@localhost ~]# find /etc/ -name ifcfg-ens33
/etc/sysconfig/network-scripts/ifcfg-ens33

user-按文件的所有人查找:

[root@localhost ~]# find /home -user root
/home

group-按文件的所有组查找:

[root@localhost ~]# find /mnt -group westos
/mnt/file2
/mnt/file3


a表示并且:

and:逻辑与,在命令中用“-a”表示,是系统缺省的选项,表示只有当所给的条件都满足时,寻找条件才算满足。

默认不加任何参数也是表示并且:

#基本使用链接多个筛选条件
[root@localhost ~]# find /mnt -user root -a -group westos
/mnt/file2
#/home目录及子目录下查找所有以.txt和.pdf结尾的文件.
find /home \( -name "*.txt" -o -name "*.pdf" \)
或
find /home -name "*.txt" -o -name "*.pdf"
#匹配文件路径或者文件,路径名符合local的文件
find /usr/ -path "*local*"
#匹配tmp或hhh*的所有文件
#or:逻辑或,在命令中用“-o”表示。该运算符表示只要所给的条件中有一个满足 时,寻找条件就算满足。例如:
find –name ’tmp’ –o –name ’hhh*’


o表示或者:

or:逻辑或,在命令中用“-o”表示。该运算符表示只要所给的条件中有一个满足 时,寻找条件就算满足。

find –name ’tmp’ –o –name ’hhh*’


[root@localhost ~]# find /mnt -user root -o -group westos
/mnt
/mnt/file2
/mnt/file3
/mnt/file4
/mnt/file5


not-表示非,即反向选择。

否定not:逻辑非,在命令中用“!”表示。该运算符表示查找不满足所给条件的文件 。

例如:

#找出/home下不是以.txt结尾的文件
find /home ! -name "*.txt"
[root@localhost ~]# find /mnt -not -user student 
/mnt
/mnt/file2
/mnt/file4
/mnt/file5


3、常用参数

按文件所在的深度(层次)查找:

maxdepth和mindepth


按文件所在的深度(层次)查找:

-maxdepth       #最大深度 
-mindepth       #最小深度

举例说明:

##-maxdepth表示最大深度,即最多层次
[root@localhost ~]# find /etc/ -maxdepth 1 -name passwd
/etc/passwd
[root@localhost ~]# find /etc/ -maxdepth 2 -name passwd
/etc/passwd
/etc/pam.d/passwd
[root@localhost ~]# 
##-mindepth表示最小深度,即最少层次
[root@localhost ~]# find /etc/ -mindepth 2 -name passwd
/etc/pam.d/passwd
[root@localhost ~]# find /etc/ -mindepth 1 -name passwd
/etc/passwd
/etc/pam.d/passwd


表示文件大小(size):

size的说明:

#等于大于小于的表示
-size  20K      # 查找大小为20K的文件
-size  -20K     # -表示小于;查找比20K小的文件
-size  +20k     # +表示大于;查看比20K大的文件
#文件大小单元:
b —— 块(512字节)
c —— 字节
w —— 字(2字节)
k —— 千字节
M —— 兆字节
G —— 吉字节


用法举例:

#查找/mnt目录下文件大小为20k的文件
[root@localhost mnt]# find /mnt/ -size 20k  
/mnt/file2
##查找/mnt目录下比20k小的文件
[root@localhost mnt]# find /mnt/ -size -20k
/mnt/
/mnt/file1
##查找/mnt目录下比20k大的文件
[root@localhost mnt]# find /mnt/ -size +20k
/mnt/file3
#搜索大于10KB的文件
find . -type f -size +10k
#搜索小于10KB的文件
find . -type f -size -10k
#搜索等于10KB的文件
find . -type f -size 10k


type文件类型:

主要的文件类型:
     f        #普通文件
     d        #目录
     b        #块设备
     s        #套接字
     c        #字符设备
     l        #链接
     p        #管道


按文件类型查找:

##f表示普通文件
[root@localhost ~]# find /dev -type f
/dev/shm/pulse-shm-620843697
/dev/shm/pulse-shm-1247103260
/dev/shm/pulse-shm-2690706600
/dev/shm/pulse-shm-368331657
##b表示块设备
[root@localhost ~]# find /dev -type b
/dev/dm-0
/dev/sr0
/dev/vdb1
/dev/vdb
/dev/vda1
/dev/vda
##s表示套接字
[root@localhost ~]# find /dev -type s
/dev/log
##p表示管道
[root@localhost ~]# find /dev -type p
/dev/initctl
[root@localhost ~]# find /mnt -type f
/mnt/file1
/mnt/file3
/mnt/file2
##d表示目录
[root@localhost ~]# find /mnt -type d
/mnt


perm表示权限:

-perm  444       #查找文件权限
-perm  -444      # -表示并且;查找文件权限中u位有r权限,并且g位有r权限,并且o位有r权限的文件
-perm  /444      # /表示或者;查找文件权限中u位有r权限,或者g位有r权限,或者o位有r权限的文件
-perm  /777      # 777=rwx rwx rwx 即9个条件中满足任意一个即可


按文件权限查找:

##查找文件权限为404的文件
[root@localhost mnt]# find /mnt -perm 404
/mnt/file2
##查看文件权限中u位有r权限,并且o位有r权限的文件
[root@localhost mnt]# find /mnt -perm -404
/mnt
/mnt/file1
/mnt/file2
##查看文件权限中u位有r权限,或者o位有r权限的文件
[root@localhost mnt]# find /mnt -perm /404
/mnt
/mnt/file1
/mnt/file2
/mnt/file3
[root@localhost mnt]# ll -d /mnt/
drwxr-xr-x. 2 root root 42 Nov 14 09:41 /mnt/


基于文件时间戳:

find . -type f 时间戳
#UNIX/Linux文件系统每个文件都有三种时间戳:
#访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
#修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
#变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。


#搜索最近七天内被访问过的所有文件
find . -type f -atime -7
#搜索恰好在七天前被访问过的所有文件
find . -type f -atime 7
#搜索超过七天内被访问过的所有文件
find . -type f -atime +7
#搜索访问时间超过10分钟的所有文件
find . -type f -amin +10
#找出比file.log修改时间更长的所有文件
find . -type f -newer file.log


借助-exec选项及其他命令结合:

-exec:对搜索的结构指令指定的shell命令。注意格式要正确:

-exec 命令 {};


在}和\之间一定要有空格才行;

{}表示命令的参数即为所找到的文件;命令的末尾必须以“ ;”结束。

#在root以及子目录查找不包括目录/root/bin的,greek用户的,文件类型为普通文件的,3天之前的名为test-find.c的文件,并将结构输出,find命令如下:
find / -name "test-find.c" -type f -mtime +3 -user greek -prune /root/bin -print
#对上述例子搜索出来的文件进行删除操作,命令如下:
find / -name "test-find.c" -type f -mtime +3 -user greek -prune /root/bin -exec rm {} \; 
#查找当前目录中所有以main开头的文件,并显示这些文件的内容。 
find . - name ‘main*’ - exec more {} \;


#删除当前目录下所有一周之内没有被访问过的a .out或*.o文件 find . \(- name a.out - o - name ‘*.o’\)> - atime +7 - exec rm {} \;


此条指令解释:

  • 命令中的“.”表示当前目录,此时 find 将从当前目录开始,逐个在其子目录中查找满足后面指定条件的文件。

  • “(” 和 “)” 表示括号(),其中的 “\” 称为转义符。之所以这样写是由于对 Shell 而言,(和)另有不同的含义,而不是这里的用于组合条件的用途。

  • “-name a.out” 是指要查找名为a.out的文件。

  • “-name ‘*.o’” 是指要查找所有名字以 .o 结尾的文件。

  • 这两个 -name 之间的 -o 表示逻辑或(or),即查找名字为a.out或名字以 .o结尾的文件。

  • find命令在当前目录及其子目录下找到这佯的文件之后,再进行判断,看其最后访问时间 是否在7天以前(条件 -atime +7),若是,则对该文件执行命令 rm(-exec rm {} \;)。

  • 其中 {} 代表当前查到的符合条件的文件名,;则是语法所要求的。

  • 上述命令中第一行的最后一个 \ 是续行符。当命令太长而在一行写不下时,可输入一个 \,之后系统将显示一个 >,指示用户继续输入命令。


基于正则表达式匹配文件路径:

find . -regex ".*\(\.txt\|\.pdf\)$"
#同上,但忽略大小写
find . -iregex ".*\(\.txt\|\.pdf\)$"


删除匹配文件:

#删除/data下所有.txt文件
find /data -type f -name "*.txt" -delete


4、场景实例解析

#找出当前目录下所有root的文件,并把所有权更改为用户tom
find .-type f -user root -exec chown tom {} \;
#上例中,{} 用于与-exec选项结合使用来匹配所有文件,然后会被替换为相应的文件名。
#找出自己家目录下所有的.txt文件并删除
find $HOME/. -name "*.txt" -ok rm {} \;
#上例中,-ok和-exec行为一样,不过它会给出提示,是否执行相应的操作。
#查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中
find . -type f -name "*.txt" -exec cat {} \;> all.txt
#将30天前的.log文件移动到old目录中
find . -type f -mtime +30 -name "*.log" -exec cp {} old \;
#找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来
find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;
#因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令
-exec ./text.sh {} \;


搜索但跳出指定目录:

#查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk
find . -path "./sk" -prune -o -name "*.txt" -print


长度为零的文件:

#列出所有长度为零的文件
find . -empty


删除大日志文件:

服务器磁盘满,一般由大的日志文件导致,需找到大文件并删除。

 find / -size +500M -print0|xargs -0 du -m|sort -nr
#find指令为找出500M以上的文件,print0和xargs -0配合使用,用来解决文件名中有空格或特殊字符问题。du -m是查看这些文件的大小,并以m为单位显示。最后sort -nr是按照数字反向排序(大的文件在前)
或者
#上述方法从根路径查找,可能列出一些系统文件。可以在这个查找之前先进行一下过滤。
#使用du -m -d 1 /|sort -nr  先看看根路径下,哪个文件夹比较大
#并且有嫌疑是导致磁盘满的罪魁祸首。然后再基于那个目录进行find。


模糊查找:

#写过一个xxx.c的文件,但是忘了放哪里了
find / -name *xxx*.c 模糊查找下这个文件


其他实例:

#在root以及子目录查找不包括目录/root/bin的,greek用户的,文件类型为普通文件的,3天之前的名为test-find.c的文件,并将结构输出,find命令如下:
find / -name "test-find.c" -type f -mtime +3 -user greek -prune /root/bin -print
#将目前目录及其子目录下所有延伸档名是 c 的文件列出来。
find . -name "*.c"
#将目前目录其其下子目录中所有一般文件列出
find . -type f
#将目前目录及其子目录下所有最近 20 天内更新过的文件列出
find . -ctime -20
#查找/var/log目录中更改时间在7日以前的普通文件,并在删除之前询问它们:
find /var/log -type f -mtime +7 -ok rm {} \;
#查找前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件:
 find . -type f -perm 644 -exec ls -l {} \;
#为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径:
find / -type f -size 0 -exec ls -l {} \;


5、完整选项及参考来源

-amin:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;
-anewer:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
-atime:查找在指定时间曾被存取过的文件或目录,单位以24小时计算;
-cmin:查找在指定时间之时被更改过的文件或目录;
-cnewer查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-ctime:查找在指定时间之时被更改的文件或目录,单位以24小时计算;
-daystart:从本日开始计算时间;
-depth:从指定目录下最深层的子目录开始查找;
-empty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录;
-exec:假设find指令的回传值为True,就执行该指令;
-false:将find指令的回传值皆设为False;
-fls:此参数的效果和指定“-ls”参数类似,但会把结果保存为指定的列表文件;
-follow:排除符号连接;
-fprint:此参数的效果和指定“-print”参数类似,但会把结果保存成指定的列表文件;
-fprint0:此参数的效果和指定“-print0”参数类似,但会把结果保存成指定的列表文件;
-fprintf:此参数的效果和指定“-printf”参数类似,但会把结果保存成指定的列表文件;
-fstype:只寻找该文件系统类型下的文件或目录;
-gid:查找符合指定之群组识别码的文件或目录;
-group:查找符合指定之群组名称的文件或目录;
-help或——help:在线帮助;
-ilname:此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别;
-iname:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别;
-inum:查找符合指定的inode编号的文件或目录;
-ipath:此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别;
-iregex:此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别;
-links:查找符合指定的硬连接数目的文件或目录;
-iname:指定字符串作为寻找符号连接的范本样式;
-ls:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出;
-maxdepth:设置最大目录层级;
-mindepth:设置最小目录层级;
-mmin:查找在指定时间曾被更改过的文件或目录,单位以分钟计算;
-mount:此参数的效果和指定“-xdev”相同;
-mtime:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
-name:指定字符串作为寻找文件或目录的范本样式;
-newer:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-nogroup:找出不属于本地主机群组识别码的文件或目录;
-noleaf:不去考虑目录至少需拥有两个硬连接存在;
-nouser:找出不属于本地主机用户识别码的文件或目录;
-ok:此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令;
-path:指定字符串作为寻找目录的范本样式;
-perm:查找符合指定的权限数值的文件或目录;
-print:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有“./”字符串;
-print0:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行;
-printf:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定;
-prune:不寻找字符串作为寻找文件或目录的范本样式;
-regex:指定字符串作为寻找文件或目录的范本样式;
-size:查找符合指定的文件大小的文件;
-true:将find指令的回传值皆设为True;
-type:只寻找符合指定的文件类型的文件;
-uid:查找符合指定的用户识别码的文件或目录;
-used:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算;
-user:查找符和指定的拥有者名称的文件或目录;
-version或——version:显示版本信息;
-xdev:将范围局限在先行的文件系统中;
-xtype:此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查。







推荐阅读

>>>新手必备-Linux入门之云计算是什么

>>>红帽认证入门-Linux系统介绍及企业版本选型

>>>新手必备-Linux系统安装配置+Xshell远程连接

>>>Linux常用命令行合集之绝对路径和相对路径

>>>软连接与硬连接



运维界升职加薪必备的云计算技术,你学了吗?

学完高级运维云计算课程之后,你可以:

  • 跨越90%企业的招聘硬门槛

  • 增加70%就业机会

  • 拿下BAT全国TOP100大厂敲门砖

  • 体系化得到运维技术硬实力

  • 技术大佬年薪可达30w+