find文件查找

男儿欲遂平生志,六经勤向窗前读。这篇文章主要讲述find文件查找相关的知识,希望能为你提供帮助。
find基础语法

find [路径] [选项] [表达式] [动作]

find选项
按文件类型查找
-type:
f:可编辑的文件
d:目录
l:软链接文件
b:块设备文件磁盘,U盘/dev/sda
c:字符设备文件 终端
s:socket安全套接字文件
p:管道文件

find [路径] [选项]
# 查看/run目录下的所有s:安全套接字文件
[root@localhost < sub> ]# find /run -type s
# 查看文件更详细的信息
[root@localhost < /sub> ]# find /run -type s|xargs ls -l
# 查询/etc/目录下所有目录,总共有多少个?
[root@localhost < sub> ]# find /etc/ -type d |wc -l
596

## 举例
# f 文件
[root@localhost < /sub> ]# find /tmp -type f
# d 目录
[root@localhost < sub> ]# find /tmp -type d
# l 链接
[root@localhost < /sub> ]# find /tmp -type l
# b 块设备
[root@localhost < sub> ]# find /tmp -type b
# c 字符设备
[root@localhost < /sub> ]# find /tmp -type c
# s 套接字
[root@localhost < sub> ]# find /tmp -type s
# p 管道文件
[root@localhost < /sub> ]# find /tmp -type p

按文件大小查找
-size
-:小于
+:大于
Num:精准但又不是太精准的匹配

# 1.在/opt下创建1000个文件
# 2.使用find找出(/opt下小于1k的文件)并删除
[root@localhost < sub> ]# touch /opt 1..1000
[root@localhost < /sub> ]# find /opt/ -size -1k|xargs rm -fr

# 1.在/opt下创建1000个文件
# 2.使用find找出(/opt下小于1k的文件)把它们全部移动到/tmp下
mv源文件目标路径
mv -t目标路径源文件
[root@localhost < sub> ]# touch /opt 1..1000
[root@localhost < /sub> ]# find /opt/ -size -1k |xargs mv -t /tmp

# xargs:
-i:指定数据流的位置,将数据流放入中
[root@localhost < sub> ]# find /opt/ -size -1k |xargs -imv/tmp

## 举例
# 查找大于5M的文件
[root@localhost < /sub> ]#find /etc -size +5M
# 查找等于5M的文件
[root@localhost < sub> ]#find /etc -size 5M
# 查找小于5M的文件
[root@localhost < /sub> ]#find /etc -size -5M
# 需求:我查找到这些文件后,想查看更详细的信息(文件的大小)
[root@localhost ~]#find /etc -size +5M -ls

按文件名称查找
-name:严格区分大小写
[root@localhost < sub> ]# find / -name cyr
[root@localhost < /sub> ]# find / -name *cyr
[root@localhost < sub> ]# find / -name cyr*
[root@localhost < /sub> ]# find / -name *cyr*

-iname:不区分大小写
[root@localhost < sub> ]# find / -iname cyr

## 举例
# 查找/目录下包含cyr名称的文件
[root@localhost < /sub> ]# find / -name "cyr"
# -i 忽略大小写
[root@localhost < sub> ]# find / -iname "cyr"
# 查找/etc目录下包含cyr名称所有文件,且不区分大小写
[root@localhost < /sub> ]# find /etc -name "cyr*"
[root@localhost ~]# find /etc -iname "cyr*"

按文件时间查找
-atime:文件访问时间查找
-mtime:文件内容创建,修改时间查找
-ctime:文件属性,修改时间查找

Num:查找第N天的文件(不包括今天)
+Num:查找第N天之前的所有文件(不包括今天)
-NUm:查找从今天开始算,7天内的文件

# 一个文件有以下三种时间
access time:atime
modify time:mtime
change time:ctime

# 查看三种时间
[root@localhost < sub> ]# stat cyr

## 举例
# 用for循环创建检测文件
for i in `seq -w 30`; do date -s 202204$i & & touch file-$i; done
# 查找7天以前的文件(不会打印当天的文件)
[root@localhost < /sub> ]# find /opt -iname file-* -mtime +7
# 查找最近7天的文件,不建议使用(会打印当天的文件)
[root@localhost < sub> ]# find /opt -iname file-* -mtime -7
# 查找第7天文件(不会打印当天的文件)
[root@localhost < /sub> ]# find /opt -iname file-* -mtime 7
# 本地文件保留最近7天的备份文件, 备份服务器保留3个月的备份文件
find /backup/ -iname "*.bak" -mtime +7 -delete
find /backup/ -iname "*.bak" -mtime +90 -delete

按照文件用户和组查找
-user:查找文件的属主
-nouser:文件没有属主用户的
-group:查找文件的属组
-nogroup:文件没有属组的

# 查找属主是chuyirui
[root@localhost < sub> ]# find /home -user chuyirui

# 查找属组是root
[root@localhost < /sub> ]# find /home -group root

# 查找属主是chuyirui, 属组是root
[root@localhost < sub> ]# find /home/ -user chuyirui -group root

# 查找属主是chuyirui, 并且属组是root
[root@localhost < /sub> ]# find /home -user chuyirui -a -group root

# 查找属主是chuyirui, 或者属组是root
[root@localhost < sub> ]# find /home/ -user chuyirui -o -group root

# 查找没有属主
[root@localhost < /sub> ]# find /home/ -nouser

# 查找没有属组
[root@localhost < sub> ]# find /home/ -nogroup

# 查找没有属主或属组
[root@localhost < /sub> ]# find /home/ -nouser -o -nogroup

# 打印目录的时候,只打印1级目录
[root@localhost < sub> ]#find /home/ -maxdepth 1 -type d-user chuyirui

# 查看更详细的信息
[root@localhost < /sub> ]# find /home -user chuyirui
[root@localhost ~]#find /home -user chuyirui -ls

多条件组合查找
for i in `seq -w 30`; do date -s 202204$i & & touch file-$i; done
for i in `seq -w 30`; do date -s 202204$i & & mkdir dir-$i; done

[root@localhost opt]# find /opt/ -mtime -7
/opt/
/opt/file-24
/opt/file-25
/opt/file-26
/opt/file-27
/opt/file-28
/opt/file-29
/opt/file-30
/opt/dir-24
/opt/dir-25
/opt/dir-26
/opt/dir-27
/opt/dir-28
/opt/dir-29
/opt/dir-30
[root@localhost opt]# find /opt/ -type d -mtime -7
/opt/
/opt/dir-24
/opt/dir-25
/opt/dir-26
/opt/dir-27
/opt/dir-28
/opt/dir-29
/opt/dir-30

文件权限查找
-perm
## 权限精确查找
[root@localhost < sub> ]# find ./ -perm 622
[root@localhost < /sub> ]# find ./ -perm 222
[root@localhost < sub> ]# find ./ -perm 644

## -权限
# 每个权限位上,都要包含数字权限的所有权限
[root@localhost < /sub> ]# #find ./ -perm -622 -ls
[root@localhost < sub> ]# #find ./ -perm 622 -ls
622
rw--w--w-

## /权限
# 总共三个权限位,只要有一个权限位的权限被包含,就可以找到
[root@localhost < /sub> ]# find ./ -perm /644 -ls
r-xr-x---
-rw-r--r--
-rw-------
属主权限位,有一个r或者有一个w就满足条件
属组权限位,有一个r就满足条件
其他用户权限位,有一个r就满足条件

按深度查找
-maxdepth
针对目录层级查找
# 查找/etc目录下的所有1级和2级目录
[root@localhost < sub> ]# find /etc/ -type d -maxdepth 2
# 查找/home目录下的所有1级和2级目录
[root@localhost < /sub> ]# find /home -type d -maxdepth 2

find动作
-print:打印查找到的内容到终端上(find命令默认就是打印结果-print)
[root@localhost < sub> ]# find /etc/ -name ifcfg*
[root@localhost < /sub> ]# find /etc/ -name ifcfg* -print
[root@localhost < sub> ]# find /etc/ -name ifcfg* -ls

-ls:查看文件的详细信息 |xargs ls-l或者ls-l$(find xxx)或者ls-l`find xxx`
[root@localhost < /sub> ]#ls -l `find /var/tmp/etc -type f`
[root@localhost < sub> ]# which cat
/usr/bin/cat
[root@localhost < /sub> ]# ls -l `which cat`
-rwxr-xr-x. 1 root root 54080 Aug 202019 /usr/bin/cat
[root@localhost < sub> ]# echo `ls -l`which cat``
[root@localhost < /sub> ]# echo $(ls -l $(which cat))
-rwxr-xr-x. 1 root root 54080 Aug 20 2019 /usr/bin/cat


-delete:删除查找到的文件(仅能删除空目录)(bug跟ls,ls看不见的,也删除不掉)并且只能删除空目录
其他删除方法:|xargs rm -fr或者rm -fr$(find xxx)或者rm -fr`find xxx`
[root@localhost < sub> ]# find /etc -name ifcfg* -delete
[root@localhost < /sub> ]# find /etc -name "ifcfg*" -exec rm -f\\;
[root@localhost < sub> ]# find / -name etc -delete
find: cannot delete ‘/run/initramfs/state/etc’: Directory not empty

-ok:找到文件后,执行后面的bash命令,询问是否要操作
语法:-ok 系统命令\\;
find / -type f -name file* -ok mv/tmp \\;
[root@localhost < /sub> ]# find /etc -name "ifcfg*" -ok cp -rvf/tmp \\;

-exec:找到文件后,执行后面的bash命令
语法:-exec 系统命令\\;
[root@localhost < sub> ]# find / -type f -name file* -exec mv/tmp \\;
[root@localhost < /sub> ]# find /etc -name "ifcfg*" -exec cp -rvf/tmp \\;

find多条件
-a:和,并且(默认)
-o:或者
!:取反

【find文件查找】


    推荐阅读