概念:find命令用于查找目录下的文件,同时也可以调用其他命令执行相应的操作。
应用场景:忘记文件所在位置,或者需要通过内容查找,这时就需要find命令了。
语法格式:find 路径 选项 表达式 动作
查找方式:文件名称、文件大小、文件时间、文件权限、属主属主等。
查找/etc目录下包含ifcfg-eth名称所有文件,-i选项可以忽略大小写。
#1.查找大于2M的文件;
find /etc/ -size +2M
#2.查找等于2M的文件;
find /etc/ -size 2M
#3.查找小于2M的文件;
find /etc/ -size -2M
#4.查找大于5M,但是小于7M的文件;fing /etc/ -size +5M -a -size -7M | xargs ls -lh
2.3 基于类型查找
#1. f=文件
find /dev -type f
#2. d=目录
find /dev -type d
#3. l=链接
find /dev -type l
#4. b=块设备
find /dev -type b
#5. c=字符设备
find /dev -type c
#6. s=套接字
find /dev -type s
#7. p=管道文件
find /dev -type p
#1. for i in {01..10};do date -s 20104$i && touch file-$i;done ==创建测试文件;
#2. find ./ -iname "file-*" -mtime +7 ==查找7天以前的文件,(不会打印第7天和当天的文件),如果删除,第1天和第2天的文件会被删除,第3天到第9天的数据会保存下来,相当于保留了最近7天的数据。
[root@localhost ~]# find ./ -iname "file-*" -mtime +7
./file-01
./file-02
#3. find ./ -iname "file-*" -mtime -7 ==查找最近7天的文件,不建议使用(会打印当天的文件),最近7天,也就是第4天到第10天的数据,如果删除,那就是删除了第4天到第10天的数据。
[root@localhost ~]# find ./ -iname "file-*" -mtime -7
./file-05
./file-06
./file-08
./file-09
./file-04
./file-07
./file-10
#4. find ./ -iname "file_*" -mtime 7 ==查找第7天文件。
[root@localhost ~]# find ./ -iname "file-*" -mtime 7
./file-03
#5. find ./ -iname "file_*" -mmin 100 =按文件的修改时间来查找文件(单位分钟)。
[root@localhost ~]# find ./ -iname "file-*" -mmin +10
./file-05
./file-06
./file-08
./file-09
./file-01
./file-03
./file-04
./file-07
./file-10
./file-02
#6. 查找/var/log下所有以.log结尾的文件,并保留最近7天的log文件。
[root@localhost ~]# find /var/log/ -type f -mtime -7 -a -name "*.log"
/var/log/anaconda/anaconda.log
/var/log/anaconda/X.log
/var/log/anaconda/program.log
/var/log/anaconda/packaging.log
/var/log/anaconda/storage.log
#1. 查找属主是jack
find /home -user jack
#2. 查找属组是admin
find /home -group admin
#3. 查找属主是jack,属组是admin
find /home -user jack -group admin
#4. 查找属主是jack,并且属组是admin
find /home -user jack -a -group admin
#5. 查找属主是jack,或者属组是admin
find /home -user jack -o -group admin
#6. 查找没有属主
find /home -nouser
#7. 查找没有属组
find /home -nogroup
#8. 查找没有属主,或者没有属组
find /home -nouser -o -nogroup
-perm [/ | -]MODE
MODE: 精确匹配,属主、属组、其他用户,每一项的权限必须相等。
find /root -type f -perm 644 -ls
-MODE: 每一项权限必须包含所指定的权限,例:包含(u涵盖6,并且g涵盖4,并且o涵盖4)。
find /root -type f -perm -644 -ls
/MODE: /或者(U为6 或者g为4 或者o为0),三项只要有一项匹配即可。
find /root -type f -perm -644 -ls
特殊权限(最低权限是4000,4755也满足需求)
find /usr/bin/ /usr/sbin/ -type f -perm -4000 -ls
find /usr/bin/ /usr/sbin/ -type f -perm -2000 -ls
find /usr/bin/ /usr/sbin/ -type f -perm -1000 -ls
-a | 与(并且) |
-o | 或(或者) |
-not|! | 非(取反) |
#1.查找当前目录下,属主不是root的所有文件
find ./ ! -user root
#2.查找当前目录下,属主属于hdfs,并且大小大于1k的文件
find ./ -type f -a -user hdfs -a -size +1k
#3.查找当前目录下的属主为root或者以xml结尾的普通文件
find ./ type f -a \(-user root -o -name "*.xml"\)
查找到一个文件后,需要对文件进行如何处理 find的默认动作是 -print
打印查找到的内容(默认) | |
-ls | 以长格式显示的方式打印查找到的内容 |
-delete | 删除查找到的文件(仅能删除空目录) |
-ok | 后面跟自定义 shell 命令(会提示是否操作) |
-exec | 后面跟自定义 shell 命令(标准写法 -exec \;) |
-maxdepth | 查找一级目录==tree -L 1 |
find /etc -name"ifcfg*" -exec cp -rvf {} /tmp \; 复制
find /etc -name"ifcfg*" -exec rm -f {} \;
find /etc -name"ifcfg*" -exec mv {} /tmp \;
xargs 将前者命令查找到的文件作为一个整体传递后者命令的输入,所以其操作的额性能极高;
exec 是将文件一个一个的处理,所以处理性能极低;
#1.删除文件,性能对比。
touch file-{1..10000}
find ./ -name "file-*" -exec rm -f {} \;
find ./ -name "file-*" | xargs rm -f
#2.文件拷贝
find /usr/sbin/ -type f -perm -4000 | xargs -i cp -rv {} /tmp
find /usr/sbin/ -type f -perm -4000 | xargs -I {} cp -rv {} /tmp
#3.find结合grep
当忘记重要配置文件存储路径时,可通过搜索关键字获取文件其路径;
find /code -type f |xargs grep -R "MySQL_PASSWORD"
find /etc/ -type f |xargs grep -R "oldxu.com"