find命令
1. find命令特点
- 实时查找
- 文件遍历
- 精确匹配
- 可以使用正则表达式模糊查询
- 速度较慢(缺点)
2. 根据文件名查找
可以使用正则匹配的方式进行模糊查询,查找指定文件夹下的匹配的文件或文件夹。
# 当前目录下的passwd文件
find ./ -name "passwd"
# 根目录下的以passwd结尾,开头未知的文件
find / -name "*passwd*"
# /etc目录下的以shadow开头,结尾位置的文件
find /etc -name "shadow*"
# /var目录下的文件名中含有nginx字符串的文件
find /var -name "*nginx*"
3. 根据文件的属主属组查找
可以根据文件或文件夹的属主属组查找文件,还可以查找没有属主属组的文件然后进行处理。
- -user:属主
- -group:属组
- -uid:根据文件的uid实现精确查找
- -gid:根据文件的gid实现精确查找
- -nouser,-nogroup:对于已经被删除用户名或用户组的文件,系统只会保留相应的gid,uid号码用以标识,而如果此时新建一个用户名就用可能取得某些文件的管理权限,出于安全的考虑,所以要对这些文件进行查找,保证安全
# 当前目录下属主属组都为zhangpf的文件
find ./ -group=zhangpf -user=zhangpf
# /home/zhangpf目录下属组为zhangpf属组为root,文件名中包含passwd的文件
find /home/zhangpf -user=zhangpf -group=root -name "*passwd*"
# 根目录下没有属组和属主的文件
find / -nouser -nogroup
- 没有属组属主的文件,如果当有新的用户添加进来之后,如果新用户的gid或uid跟这些文件原来的gid或uid一样,那么这些文件就会属于这个新的用户,这也是一个安全隐患,一定要注意
4. 根据文件类型进行查找
根据文件类型进行查找:-type [文件类型]
f:普通文件
d:目录文件
l:符号链接文件
s:套接字文件
b:块处理设备文件
c:字符设备文件
p:管道文件
# 查找/tmp下的套接字文件
find /tmp -type s
# 查找/var下的套接字文件,且文件名中含有sock
find /var -type s -name "*sock*"
# 查找/etc下的符号链接文件
5. 根据文件大小进行查找
-size [+或-] [文件大小]
查找比SIZE还要大(+)或者小(-)的文件文件大小的表示:
c:代表byte,k:代表1024bytes,M:代表1024k,G:表示1024M
# 查找/root下大于100M的文件并用'ls -lh'命令显示其属性
find /root -size +100M -print | xargs ls -lh
# 查找/root下大于50M且小于100M的文件并列出其属性信息
find /root -size +50M -a -size -100M -print | xargs ls -lh
6. 根据文件的时间进行查找
文件的时间有3种,mtime(Modify time,文件内容变更)、ctime(Change time,文件属性变更)、atime(Access time,文件被访问),以下详细介绍
mtime:当文件的“内容数据” 更改时,就会更新这个时间。内容数据指的是文件的内容,而不是文件的属性与权限
ctime:当文件的状态发生变化时,就会更新这个数据,比如:权限与属性发生变化
atime:当文件的内容被读取时,就会更新这个时间以天为单位查找:-ctime,-atime,-mtime
以分钟为单位查找:-cmin,-amin,-mmin-newer用在分辨两个文件之间的新旧关系,默认以mtime为准
对比文件的新旧程度查找:-newer,-anewer,-cnewer+4:代表大于等于五天前的文件名:find /var -mtime +4
-4: 代表小于等于四天内的文件名
4:代表4~5天那一天的文件
示例:
# 从现在开始到24小时之前有过改动的文件全部列出来
find / -mtime 0
# 寻找四天前的那一天被改动的文件
find /var -mtime 4
# 四天之内被改动过的文件
find /var -mctime -4
# 查找当前文件夹下10分钟之内被修改的文件,并列出ctime信息
find . -cmin +10 -print | xargs ls -cl
# 寻找/etc下面的文件日期(mtime)比/etc/passwd新的文件
find /etc -newer /etc/passwd
#查找某个比文件file1新且比file2旧 的文件
find ~ -newer test1! test2 -print
7. 根据文件所属的权限查找
根据文件权限进行查询:-prem [option]
- -perm mode
精确查找,文件权限正好等于mode,mode为类似于chmod的属性值- -perm -mode
每一类对象都必须拥有其指定的权限标准- -perm /mode
任何一类(u,g,o)对象的权限只要有一位匹配即可
示例:
# 文件属主属组都有写权限的,只要匹配一项就可以
find . -perm /u+w,g+w
# 文件属主权限为读,或属组权限为读的文件
find . -perm /u=w,g=w
# 文件属性为220(属组或属主为可执行)的文件
find . -perm /220
#
find . -perm -444 -perm /222 ! -perm /111
find . -perm -a+r -perm /a+w ! -perm /a+x
8. 多条件查找
命令的组合用法
- 与:-a
- 或:-o
- 非:-not,-!
9. 其它相关
对于find查找出来的文件或文件夹,有时候需要做一些处理,下面介绍一下相关的命令
9.1. | xargs command ;
例:somecommand |xargs -item command
不带command ,默认的使用echo 输出
用途:
- 1.构造参数列表并运行命令,即将接收的参数传递给后面的command 命令执行
- 2.将多行输入转换为单行 (特殊功效)
优点:
- 1.将输入参数整理后,去除换行符,以一个列表形式处理
- 2.避免参数过长引发的问题,使用xargs -n 参数适当控制,对于经常产生大量输出的命令如find、locate和grep来说非常有用
XARGS 一般是和管道一起使用:
XXcomand | xargs -x comand initial-args
-x 代表选项
选项:
-p:操作具有可交互性,每次执行comand都交互式提示用户选择
-i:-i选项告诉 xargs 可以使用{}代替传递过来的参数, 建议使用-I,其符合POSIX标准
参考:
# 查找当前文件夹下10分钟之内被修改的文件,并列出ctime信息
find . -cmin +10 -print | xargs ls -cl
9.2. -delete:删除查找到的文件
# 查找后显示,然后删除查找到的文件
find . -cmin -10 -print -delete
9.3. -fls /path/to/somefile
查找到的文件的长格式信息保存至指定的文件夹
find /var/log -ctime -4 -fls /tmp/test/abc
9.4. -ok command {} \ ;
对查找的文件执行由command指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认,与下面的-exec类似。
9.5. -exec command {} \;
对查找到的每个文件执行由command执行的命令
{}:用于引用查找到的文件名称自身;
注意:find传递查找到的文件至后面指定的命令时,查找到的所有符合的文件一次性传递给后面的命令
find -exec 与xargs 区别
参考:
例:
find . -name "*.txt" -exec rm {} \;
find . -name "*.txt" | xargs rm {}
-exec
1.参数是一个一个传递的,传递一个参数执行一次rm
2.文件名有空格等特殊字符也能处理
-xargs
1.一次将参数传给命令,可以使用-n控制参数个数
2.处理特殊文件名需要采用如下方式:
find . -name "*.txt" print0 |xargs -0 rm {}
示例
1.查找/var 目录下属主为root,且属组为mail的所有文件或目录并列出
find /var -user root -group mail -ls
2.查找/usr 目录下不属于root、bin、hadoop的所有文件或目录
find /usr -not -user root -not -user hadoop -not -user bin -ls
find /usr -not \( -user root -o -user hadoop -o -not -user bin \) -ls
3.查找/etc目录下最近一周内其内容修改过,同时属主不为root,也不为hadoop的文件或目录
find /etc -mtime -7 -a -not \( -user root -o -user hadoop \) -ls
4.查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录
find / -ctmie -7 -a -nouser -a nogroup
5.查找/etc目录下大于1M且类型为普通文件的所有文件
find /etc -size +1M -a -type f -ls
6.查找/etc目录下所有用户都没有写权限的文件
find /etc -not -perm /222 -ls
7.查找/etc目录下至少有一类用户没有执行权限的文件
find /etc -not -perm -111 -ls
8.查找/etc/init.d/目录下,所有用户都有执行权限,且其他用户有写权限的文件
find /etc/init.d -prem /113 -ls
9.查找/tmp/test/y目录下在100分钟内修改过的文件,并删除
find /tmp/test/y -cmin -100 -print | xargs /bin/rm -fr
find /tmp/test/y -cmin -100 -delete
find /tmp/test/y -cmin -100 -ok rm -fr '{}' \; #需要询问
find /tmp/test/y -cmin -100 -exec rm -fr '{}' \;
10.查找/var/log目录下为文件类型且在10分钟内被修改过的文件,并列出
find /var/log -type f -cmin -10 -exec ls -l '{}' \;
11.查找/var/log下的在四天内被修改过的文件并把它们的长格式信息保存至/tmp/test/abc
find /var/log -ctime -4 -fls /tmp/test/abc
12.查找test.c并备份为test.c.bak
find . -name "text.c" -exec cp {} {}.bak \;
13.查找文件名为[]中的任意字符的文件
使用了通配符进行正则匹配
find ./ -name "[ab]"
14.查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,执行命令前需要确认)
find ./ -type d -ok ls {} \;
15.查找空文件或空目录
find ./ -empty
16.查找空文件并删除
find ./ -empty -type f -print -delete
17.查找名字符合正则表达式的文件,注意前面的‘.*’(查找到的文件带有目录)
find ./ -regex .*so.*\.gz
18.查找时忽略一个目录或者多个目录
find ./ ! -path "./output/*" ! -path "./output1/*" -type f | xargs grep ""