基本语法
find [查找目录] [选项] [查找规则] [查找完后的操作] 即:find pathname -option -condition [-print -exec -ok …]
选项参数
- -amin # 查找在系统中最后N分钟访问的文件
- -anewer<参考文件或目录>: 查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
- -atime -n +n #按文件访问时间来查GIN: 0px">
- -cmin<分钟>: 查找在指定时间之时被更改过的文件或目录;
- -cnewer<参考文件或目录> 查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
- -ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
- -daystart: 从本日开始计算时间;
- -depth: 从指定目录下最深层的子目录开始查找;
- -expty: 寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录;
- -exec<执行指令>: 假设find指令的回传值为True,就执行该指令;
- -false: 将find指令的回传值皆设为False;
- -fls<列表文件>: 此参数的效果和指定“-ls”参数类似,但会把结果保存为指定的列表文件;
- -follow: #如果遇到符号链接文件,就跟踪链接所指的文件
- -fprint<列表文件>: 此参数的效果和指定“-print”参数类似,但会把结果保存成指定的列表文件;
- -fprint0<列表文件>: 此参数的效果和指定“-print0”参数类似,但会把结果保存成指定的列表文件;
- -fprintf<列表文件><输出格式>:此参数的效果和指定“-printf”参数类似,但会把结果保存成指定的列表文件;
- -fstype #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
- -gid<群组识别码>: 查找符合指定之群组识别码的文件或目录;
- -group<群组名称>: 查找符合指定之群组名称的文件或目录;
- -help或——help: 在线帮助;
- -ilname<范本样式>: 此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别;
- -iname<范本样式>: 此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别;
- -inum: 查找符合指定的inode编号的文件或目录;
- -ipath<范本样式>: 此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别;
- -iregex<范本样式>: 此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别;
- -links<连接数目>: 查找符合指定的硬连接数目的文件或目录;
- -iname<范本样式>: 指定字符串作为寻找符号连接的范本样式;
- -ls: 假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出;
- -maxdepth<目录层级>: 设置最大目录层级;
- -mindepth<目录层级>: 设置最小目录层级;
- -mmin # 查找在系统中最后N分钟里修改过的文件
- -mount: #查文件时不跨越文件系统mount点,此参数的效果和指定“-xdev”相同;
- -mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
- -name<范本样式>: 指定字符串作为寻找文件或目录的范本样式;
- -newer f1 !f2 #查更改时间比f1新但比f2旧的文件
- -nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
- -noleaf: 不去考虑目录至少需拥有两个硬连接存在;
- -nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
- -ok<执行指令>: 此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令;
- -path<范本样式>: 指定字符串作为寻找目录的范本样式;
- -perm<权限数值>: 查找符合指定的权限数值的文件或目录;
- -print: 假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有“./”字符串;
- -print0: 假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行;
- -printf<输出格式>: 假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定;
- -prune: #忽略某个目录
- -regex<范本样式>: 指定字符串作为寻找文件或目录的范本样式;
- -size n[c] #查长度为n块[或n字节]的文件
- -true: 将find指令的回传值皆设为True;
- --type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
- -uid<用户识别码>: 查找符合指定的用户识别码的文件或目录;
- -used<日数>: 查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算;
- -user<拥有者名称>: 查找符和指定的拥有者名称的文件或目录;
- -version或——version: 显示版本信息;
- -xdev: 将范围局限在先行的文件系统中;
- -xtype<文件类型>: 此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查。
后续操作
-exec:对匹配的文件执行该参数所给出的shell命令,形式为:command {} \,({}和\,之间有空格)。
-ok:与exec作用相同,区别是在执行命令之前,都会给用户提示,让用户确认是否执行
注意:
1)”{}”和””之间有一个空格。
2)-ok:和-exec的作用相同,只不过-ok更加安全一点,在执行每一个命令之前,系统会让用户确定是否执行。
逻辑运算
- -a:and逻辑与。find 命令也支持逻辑运算符选项,其中 -a 代表逻辑与运算,也就是 -a 的两个条件都成立,find 搜索的结果才成立。
- -o:or逻辑或。就是 -o 的两个条件只要其中一个成立,find 命令就可以找到结果。
- -not:not逻辑非。就是取反的意思。
基本使用
根据文件名查找
- 在根目录下查找test开头的文件,文件名区分大小写
命令:find / -name ‘test*.txt’
- 在/var/xiaoming目录下查找test1.txt,test2.txt,test3.txt,文件名区分大小写
命令:find /var/xiaoming -name 'test[123].txt'
- 在/var/xiaoming目录下查找test1.txt,test2.txt,TEST3.txt,Test4.txt,文件名不区分大小写。?表示任意单个字符
命令:find /var/xiaoming -iname 'test?.txt'
根据文件类型查找
-type 为类型参数:
f 表示文件
d 表示目录
c 表示字符设备
b 表示块设备
s 表示套接字
l 表示链接
- 在根目录下查找名为test的文件夹
命令:find / -type d -name 'test'
根据文件大小查找
文件大小参数:
b —— 块(512字节)
c —— 字节
w —— 字(2字节)
k —— 千字节
M —— 兆字节
G —— 吉字节
说明:命令中的'+’,’-’,’=’分别表示大于,小于和等于,注意如果不加符号就表示要找文件的大小必须恰好等于这个值才符合条件
- 在/var/xiaoming目录下查找文件大小在10kb和500kb之间的文件
命令:find /var/xiaoming -type f -size +10k
根据时间查找
UNIX/Linux文件系统每个文件都有三种时间戳:
- 访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
- 修改时间(数据修改时间)(-mtime/天,-mmin/分钟):文件最后一次修改时间。
- 变化时间(状态修改时间)(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
注意:“+”:表示多长时间前被操作过的文件;“-”:表示多长时间内被操作过的文件;没有符号表示等于这个时间点被操作过的文件
- 查找根目录下10分钟之前30分钟之内数据被修改过的文件
命令:find / -mmin +10 -mmin -30
- 查找根目录下5天前10天内文件属性修改过的文件
命令:find / -ctime +5 -ctime -10
- 查找根目录下5天内被访问过的文件
命令:find / -type f -atime -5
根据用户/组来查找
选项:
- -uid 用户 ID:按照用户 ID 査找所有者是指定 ID 的文件
- -gid 组 ID:按照用户组 ID 査找所属组是指定 ID 的文件
- -user 用户名:按照用户名査找所有者是指定用户的文件
- -group 组名:按照组名査找所属组是指定用户组的文件
- -nouser:査找没有所有者的文件
- 查找当前目录下所有的所有者为root的文件
命令:find . -user root
- 查找当前目录下没有所有者的文件
命令:find . -nouser
- 在根目录下查找文件用户组名事root的文件
命令:find ./ -group root
maxdepth和mindepth
-maxdepth n : 搜索深度距离当前目录最多n个子目录深度
-mindepth n :搜索深度距离当前目录至少n个子目录深度
- 搜索出深度距离当前目录至少2个子目录的所有文件
命令:find . -maxdepth 2 -type f
- 搜索出深度距离当前目录至少3个子目录的名称为test1.txt的文件
命令:find . -mindepth 3 -type f -name 'test2.txt'
查找空目录
- 查找当前目录下空文件
命令:find . -empty
根据权限来查找
选项:
- -perm 权限模式:査找文件权限刚好等于"权限模式"的文件
- -perm -权限模式:査找文件权限全部包含"权限模式"的文件
- -perm +权限模式:査找文件权限包含"权限模式"的任意一个权限的文件
- 在/var/kuangxiang目录下查找权限为444的文件
命令:find /var/kuangxiang -type f -perm -444
- 找出当前目录下权限不是644的php文件
命令:find . -type f -name "*.php" ! -perm 644
按照硬连接的数目进行查找
-link n :硬连接连接数等于n的文件或目录 ;-link +n:硬连接连接数大于n的文件或目录;-link -n:硬连接连接数小于n的文件或目录
- 查找根目录下硬连接数为3的文件
命令:find / -link 3
逻辑运算查找
-a:与运算
- 查找当前目录下txt结尾喝php结尾且权限为644的文件
命令:find -type f -name '*.txt' -a -name '*.php' -a -perm 644
-o:或运算
- 查找当前目录下名为test1.txt文件或者名为test2的文件夹
命令:find . -type f -name 'test1.txt' -o -type d -name 'test2'
-not:对条件进行取反
- 查找当前目录下文件大小不等于0的文件
命令:find . -not -size 0
其他操作
- 查找当前目录下的空文件并删除。其中,”{}”就代表查找之后返回的文件,{}和之间必须有空格,且最后必须有分号。
命令:find . -empty -exec rm -f {} ;
- 查找当前目录下的名称为test1.txt的文件并且展示文件相关属性
命令:find .-name 'test1.txt' -exec ls -l {} ;
- 查找当前所有以 abc 开头并且不含 .php 扩展名的文件
命令:find
.
-name
'abc*'
! -name
'*.php'
- 在/var/xiaoming和/var/zhangsan目录下查询名为test.txt的文件
命令:find /var/xiaoming /var/zhangsan -type f -name 'test.txt'
- 在当前目录下查找隐藏文件、
命令:find . -type f -name ".*"
- 在/etc下查找只读文件
命令:
find
/etc
-maxdepth 1 -perm
/u
=r
- 在/bin目录下查找可执行文件
命令:find
/bin
-maxdepth 2 -perm
/a
=x
- 查找最大和最小的文件
我们可以将 find 命令与 ls 和 sort命令结合,从而找出最大或最小的文件。下面的命令使用了 sort 命令的 -r 选项,也就是从大到小降序排列。经过 head 命令的过滤之后,会显示当前目录和子目录下最大的5个文件。命令的执行过程需要一段时间,查找的速度取决于文件的总数,如下:
命令:find . -type f -exec ls -s {} ; | sort -n -r | head 5
同样,我们可以去掉 sort 命令的 -r 选项来进行升序排列,从而显示出最小的5个文件,如下:
命令:find . -type f -exec ls -s {} ; | sort -n | head 5
- 查找根目录下以log结尾以外的文件
命令:find ./ ! -name "*.log"
- 查找比某文件新或某文件旧的文件
环境上日志文件太多,想删除某个时间之前的文件,该怎么处理?
可以利用以下参数:
- newer 修改时间更新的
- anewer 访问时间更新的
- ctime 修改时间更新的,包括属性的修改
命令:find ./ ! -newer 1.log |xargs ls -al #列出比1.log更旧的文件
find ./ -newer 1.log |xargs ls -al #列出比1.log更新的文件
这里我只是列出,并没有删除,删除可参考前面介绍的删除找到的文件。而如果要查找出比文件1更新,比文件2旧的文件,只需要利用组合条件即可。
find与xargs
在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;
而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
来看看xargs命令是如何同find命令一起使用的,并给出一些例子。
find . -type f -print | xargs file 查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件
find / -name "core" -print | xargs echo "" >/tmp/core.log 在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:
find . -type f -print | xargs grep "hostname" 用grep命令在所有的普通文件中搜索hostname这个词
find /etc -type f "*.*" | xargs grep "TMOUT" 从etc目录下的任何文件中搜索包含有TMOUT字符的文件
find ./ -mtime +3 -print|xargs rm -f –r 删除3天以前的所有东西(find . -ctime +3 -exec rm -rf {} ;)
find ./ -size 0 | xargs rm -f & 删除文件大小为零的文件
find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。
学习链接