find 命令详解
文件查找-find
find命令的基本语法
命令 | 路径 | 选项 | 表达式 | 动作 |
---|---|---|---|---|
find | path | options | express | action |
[root@oldboy ~]# find /etc/ -name '*.sh'
/etc/profile.d/colorgrep.sh
/etc/profile.d/colorls.sh
/etc/profile.d/which2.sh
/etc/profile.d/less.sh
/etc/profile.d/256term.sh
根据文件名查找 -name
选项: -name 'filename'
# 包含ifcfg-eth0的文件
[root@oldboy ~]# find /etc/sysconfig/network-scripts/ -name 'ifcfg-eth0'
/etc/sysconfig/network-scripts/ifcfg-eth0
[root@oldboy ~]# find /etc/sysconfig/network-scripts/ -name 'ifcfg-eth*'
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfg-eth2
[root@oldboy ~]# find /etc/ -iname 'ifcfg-eth*' # -iname 忽略大小写
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfg-eth2
/etc/sysconfig/network-scripts/ifcfg-eth3
/etc/sysconfig/network-scripts/ifcfg-ETH3
[root@oldboy ~]# find /etc/ -name '*eth*' # 包含eth的文件
[root@oldboy ~]# find /etc/ -iname '*eth*' # 包含eth的文件,不区分大小写
注:不管是开头还是结尾eth都会被匹配
根据数据大小查找 -size
选项: -size n
`b' for 512-byte blocks (this is the default if no suffix is used)
`c' for bytes
`w' for two-byte words
`k' for Kilobytes (units of 1024 bytes)
`M' for Megabytes (units of 1048576 bytes)
`G' for Gigabytes (units of 1073741824 bytes)
# 查找大于5M的文件
[root@gong ~]# find /etc/ -size +5M
/etc/udev/hwdb.bin
[root@gong ~]# find /etc/ -size +5M|xargs du -sh
7.6M /etc/udev/hwdb.bin
[root@gong ~]# find /etc/ -size +5M -delete
-delete 后面的动作,删除
-exec
# 查找等于5M的文件
[root@gong ~]# find /etc/ -size 5M
# 查找小于5M的文件
[root@gong ~]# find /etc/ -size -5M -ls
-ls 后面添加的动作-查看
# 文件大小和名字组合起来使用
[root@gong ~]# find /etc/ -size -5M -name '*.sh'
# 需求:在/etc/ 找到.sh和.conf结尾的文件,并且小于5M
[root@gong ~]# find /etc/ -size -5M -name '*.sh' -o -name '*.rules'
根据文件类型查找 -type
文件类型:
l d - s p b
# 根据文件类型查找
-type
b 块设备
f file文件
d dire目录
c 字符设备
p 管道文件
l 链接文件
s socket文件
[root@oldboy ~]# find /etc/ -type f
[root@oldboy ~]# find /etc/ -type d
[root@oldboy ~]# find /etc/ -type l
[root@oldboy ~]# find /etc/ -type f -ls
[root@oldboy ~]# find /etc/ -type f |xargs ls -l
条件语句
-a 并且
[root@oldboy ~]# find /etc/ -size +3M -a -size -5M -name '*.txt'
/etc/ff.txt
-o 或者
[root@oldboy ~]# find /etc/ -size -5M -name '*.sh' -o -name '*.rules'
! 取反
find /etc/ ! \( -size +5M -o -name '*eth0' \)
根据日期查找 -mtime
选项: -mtime
# 查找7天前的文件,不包括第七天(不包括今天)
for i in `seq -w 30`
do
date -s "202004$i"
touch /tmp/file$i.log
done
[root@oldboy /tmp]# find /tmp/ -mtime +7
# 查找进7天的文件,不包含前第七天的
[root@oldboy /tmp]# find /tmp/ -mtime -7
# 查找第七天的内容(不包含今天的)
[root@oldboy /tmp]# find /tmp/ -mtime 7
/tmp/file23.log
# 企业需求,只保留七天的备份
find /opt ! -mtime -7 -name '*.log' -delete
[root@oldboy /tmp]# find /tmp/ ! -mtime -7 |xargs rm -fr
动作
-ls
-exec
-delete
find动作很少使用。
find根据用户查找文件
-user # 查找属主是某个用户
-group # 查找属组是哪个属组的
-nouser # 查找没有用户
-nogroup # 查找没有属组
[root@oldboy /tmp]# find / -type f -user gong| xargs ls -l
[root@oldboy /tmp]# find / -type f -user gong
/home/gong/gong.txt
[root@oldboy /tmp]# find / -type f -user gong -group jiang
[root@oldboy /tmp]# find / -type f -user gong -o -group jiang
/home/jiang/xia.txt
/home/gong/gong.txt
find根据深度查找
-maxdepth
[root@oldboy /tmp]# find /etc/ -maxdepth 2 -type f -name '*.conf'
find根据文件权限查找
-perm
[root@oldboy /tmp]# find /tmp -perm 755 -ls 精确的匹配权限位
find /tmp -perm -222 -ls # 属主、属组、其它都包含w权限的
[root@oldboy /tmp]# find /tmp -perm /442 -ls # 属主位至少有4,或者属组位至少有4,或者其它至少有2
find动作
-print # 打印出查找的内容但是默认就可以打印。
-ls # 找出的结果打印详细信息
find /opt/ -type f -perm 222 -ls
-delete # 默认会删除空目录,能删除文件。
find ./ -type f -mtime +20 -delete
find ./ -type f -mtime +5|xargs rm -fr
-ok
find /opt/ -type f -name '*.log' -ok cp {} /tmp \; # 会在操作的时候询问
< cp ... /opt/file01.log > ? y
-exec
find ./ -mtime +5 |xargs -i cp {} /opt
find /tmp -mtime +5 -exec cp {} /opt \;
find ./ -mtime +5 |xargs cp -t /opt
find /opt/ -mtime +5 |xargs -I {} cp {} /tmp/
# find结合xargs使用
# 拷贝
find / -type f |xargs cp -t /tmp
# 查看
find / -type f |xargs ls -l
# 替换
find / -type f |xargs sed -i 's#a##Ag'
# 移动
find / -type f |xargs mv -t /tmp
# 删除
find / -type f | xargs rm -fr