find查找
find命令可以根据不同的条件来进行查找文件,例如:文件名称、文件大小、文件修改时间、属主属组、权限、等等方式。
find命令的基本语法:
命令 | 路径 | 选项 | 表达式 | 动作 |
---|---|---|---|---|
查找 | 地区 | 妹纸 | 18-25岁 | 约? |
1. 按名称查找name
[root@ennan ~]# find /etc -name "ifcfg*"
# 在/etc目录下查找名称以ifcfg开头的文件
[root@ennan ~]# find /etc/ -iname "iFC*"
# 在/etc目录下查找名称以iFC开头的文件,不区分大小写
2. 按文件大小查找size
[root@ennan ~]# find /etc/ -size +5M
# 在/etc下查找大于5M的文件
[root@ennan ~]# find /etc/ -size -5M
# 在/etc下查找小于5M的文件
[root@ennan ~]# find /etc/ -size 5M
# 在/etc下查找大小为5M的文件(四舍五入)
2. 按文件类型查找type
[root@ennan ~]# find /dev/ -type f
# f为文件
[root@ennan ~]# find /dev/ -type d
# d为目录
[root@ennan ~]# find /dev/ -type l
# l为连接
[root@ennan ~]# find /dev/ -type b
# b为块设备
[root@ennan ~]# find /dev/ -type c
# c为字符设备
[root@ennan ~]# find /dev/ -type s
# s为套接字
[root@ennan ~]# find /dev/ -type p
# p为管道文件
3. find时间查找mtime
如图,假设当前日期是10号,向前推6天(不包括当前日期)为4号,4号以前的日期用+6表示,4号之后的日期用-6表示,4号用6表示。
[root@MiWiFi-R3L-srv ~]# date
Sat Aug 31 00:00:49 CST 2019
# 系统当前日期为31号
[root@MiWiFi-R3L-srv ~]# for i in {1..31}; do date -s "2019/08/$i" ; touch file-$i ; done
# 通过循环创建file-1 , file-31
[root@MiWiFi-R3L-srv ~]# ls
file-1 file-14 file-19 file-23 file-28 file-4 file-9
file-10 file-15 file-2 file-24 file-29 file-5
file-11 file-16 file-20 file-25 file-3 file-6
file-12 file-17 file-21 file-26 file-30 file-7
file-13 file-18 file-22 file-27 file-31 file-8
[root@MiWiFi-R3L-srv ~]# find ./ -type f -mtime 6
# -mtime 6表示从当前日期向前推6天,即25号
./file-25
[root@MiWiFi-R3L-srv ~]# find ./ -type f -mtime +6 -name "file*"| xargs ls
# 筛选出6天之前的文件
./file-1 ./file-12 ./file-15 ./file-18 ./file-20 ./file-23 ./file-4 ./file-7
./file-10 ./file-13 ./file-16 ./file-19 ./file-21 ./file-24 ./file-5 ./file-8
./file-11 ./file-14 ./file-17 ./file-2 ./file-22 ./file-3 ./file-6 ./file-9
[root@MiWiFi-R3L-srv ~]# find ./ -type f -mtime -6 -name "file*"| xargs ls
# 筛选出最近6天的文件
./file-26 ./file-27 ./file-28 ./file-29 ./file-30 ./file-31
保留最近7天的文件
[root@MiWiFi-R3L-srv ~]# find ./ -name "file*" -type f -mtime +7 | xargs rm -f
[root@MiWiFi-R3L-srv ~]# ll
total 0
-rw-r--r--. 1 root root 0 Aug 24 00:00 file-24
-rw-r--r--. 1 root root 0 Aug 25 00:00 file-25
-rw-r--r--. 1 root root 0 Aug 26 00:00 file-26
-rw-r--r--. 1 root root 0 Aug 27 00:00 file-27
-rw-r--r--. 1 root root 0 Aug 28 00:00 file-28
-rw-r--r--. 1 root root 0 Aug 29 00:00 file-29
-rw-r--r--. 1 root root 0 Aug 30 00:00 file-30
-rw-r--r--. 1 root root 0 Aug 31 00:00 file-31
本地文件保留最近7天的备份文件, 备份服务器保留3个月的备份文件。(实际使用方案)
4. 按用户和组进行查找user group nouser nogroup
[root@MiWiFi-R3L-srv ~]# find /home/ -user ennan
# 查找属主是ennan的文件
[root@MiWiFi-R3L-srv ~]# find /home/ -group ennan
# 查找属组是ennan的文件
[root@MiWiFi-R3L-srv ~]# find /home/ -type d -user ennan -group ennan
# 查找属主是ennan,属组也是ennan的目录
[root@MiWiFi-R3L-srv ~]# find /home/ -nouser
# 查找没有属主的文件
[root@MiWiFi-R3L-srv ~]# find /home/ -nogroup
# 查找没有属组的文件
[root@MiWiFi-R3L-srv ~]# find / -nouser -nogroup
# 查找没有属主和属组的文件
查找后的处理动作
查找到一个文件后,需要对文件进行如何处理?
动作 | 含义 |
---|---|
-ls | 以长格式显示的方式打印查找到的内容 |
-exec | 后面跟自定义 shell 命令(标准写法 -exec ;) |
查找/var/log/类型是文件的,并且名称是.log结尾的,并且7天以前的,然后删除
[root@MiWiFi-R3L-srv ~]# find /var/log/ -type f -name "*.log" -mtime +7 | xargs rm -f
# 首选,速度最快
[root@MiWiFi-R3L-srv ~]# find /var/log/ -type f -name "*.log" -mtime +7 -exec rm -rf {} \;
# 次之,速度相对较慢
[root@MiWiFi-R3L-srv ~]# find /var/log/ -type f -name "*.log" -mtime +7 -delete
# 不推荐,删除查找到的文件(仅能删除空目录)
记得文件的内容是什么,但是不清楚文件名称是什么,也不知道路径在哪,怎么办?
[root@MiWiFi-R3L-srv ~]# find /etc/ -type f | xargs grep "log_group" --color=auto
/etc/audit/auditd.conf:log_group = root
find逻辑运算符
符号 | 作用 |
---|---|
-a | 与 |
-o | 或 |
! | 非,同-not |
- 查找/home目录下,属主不是root的所有文件
[root@MiWiFi-R3L-srv ~]# find /home ! -user root -type f | xargs ls -l
- 查找/home目录下,属主属于ennan,并且大小大于1k的文件
[root@MiWiFi-R3L-srv ~]# find /home -user ennan -size +1k -type f | xargs ls -lh
-rw-rw-r--. 1 ennan ennan 2.5K Aug 8 10:35 /home/ennan/a
-rw-rw-r--. 1 ennan ennan 3.2K Aug 8 10:40 /home/ennan/c
练习题
1.查找/var目录下,属主不是root,且文件名不以f开头的文件
[root@MiWiFi-R3L-srv ~]# find /var ! -user root ! -name "f*" -type f
2.查找/var目录下属主为root,且属组为mail的所有文件
[root@MiWiFi-R3L-srv ~]# find /var -user root -group mail -type f
3.查找/var目录下不属于root、lp的所有文件
[root@MiWiFi-R3L-srv ~]# find /var/ ! -user root ! -user lp -type f
4.查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
[root@MiWiFi-R3L-srv ~]# find /var/ -mtime -7 ! -user root ! -user postfix -type f
5.查找/etc目录下大于1M且类型为普通文件的所有文件
[root@MiWiFi-R3L-srv ~]# find /etc/ -type f -size +1M
6.将/etc/中的所有目录(仅目录)复制到/tmp下,目录结构不变
[root@MiWiFi-R3L-srv ~]# find /etc/ -type d | xargs -i mkdir -p /tmp/{}
# -i 表示 find 传递给xargs的结果 由{}来代替
或者
[root@MiWiFi-R3L-srv ~]# find /etc/ -type d -exec mkdir -p /tmp/{} \;
7.将/etc目录复制到/var/tmp/,/var/tmp/etc的所有目录权限777/var/tmp/etc目录中所有文件权限666
[root@MiWiFi-R3L-srv ~]# cp /etc/ /var/tmp/ -rp
[root@MiWiFi-R3L-srv ~]# find /var/tmp/etc/ -type d | xargs -i chmod 777 {}
[root@MiWiFi-R3L-srv ~]# find /var/tmp/etc/ -type f | xargs -i chmod 666 {}
或
[root@MiWiFi-R3L-srv ~]# find /var/tmp/etc/ -type d -exec chmod 777 {} \;
[root@MiWiFi-R3L-srv ~]# find /var/tmp/etc/ -type f -exec chmod 666 {} \;
8.保留/var/log/下最近7天的日志文件,其他全部删除
[root@MiWiFi-R3L-srv ~]# find /var/log/ -mtime +7 -type f | xargs rm -rf
9.创建touch file{1..10}10个文件, 保留file9,其他一次全部删除
[root@MiWiFi-R3L-srv ~]# find ./ ! -name "file9" -name "file*" | xargs rm -rf
10.解释如下每条命令含义
mkdir /root/dir1
touch /root/dir1/file{1..10}
find /root/dir1 -type f -name "file5"
find /root/dir1 ! -name "file5"
find /root/dir1 -name "file5" -o -name "file9"
find /root/dir1 -name "file5" -o -name "file9" -ls
find /root/dir1 \( -name "file5" -o -name "file9" \) -ls
find /root/dir1 \( -name "file5" -o -name "file9" \) -exec rm -rvf {} \;
find /root/dir1 ! \( -name "file4" -o -name "file8" \) -exec rm -vf {} \;