find概述
有些时候我们需要用上一些文件,但是却忘了这个文件的具体所在位置,这个时候就需要用到文件查找。
find命令是Linux下必须掌握的命令,find命令可以通过不同的条件来精确定位到我们想要查找的文件,任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
find语法格式:
find 路径 选项 表达式 动作
常用选项:
-
按名称查找 -name
#查找/etc/目录下包含ifcfg-ens32名称的文件 [root@localhost ~]# find /etc/ -name ifcfg-ens32 /etc/sysconfig/network-scripts/ifcfg-ens32 #使用-iname查找时不区分大小写 [root@localhost ~]# find /etc/ -iname ifcfg-ens32 /etc/sysconfig/network-scripts/ifcfg-ens32 /etc/sysconfig/network-scripts/IFCFG-ens32 #查找/etc/目录下所有以ens32结尾的文件 [root@localhost ~]# find /etc/ -name *ens32 /etc/sysconfig/network-scripts/ifcfg-ens32 /etc/sysconfig/network-scripts/IFCFG-ens32 #查找/etc/目录下所有以ifcfg开头的文件 [root@localhost ~]# find /etc/ -name ifcfg* /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-ens32
-
按文件大小查找 -size
#查找大于5M的文件 find /etc -size +5M #查找小于5M的文件 find /etc -size -5M #查找大小为5M的文件 find /etc -size 5M
-
按文件类型查找 -type
# f 文件类型 find /dev -type f # d 目录类型 find /dev -type d # l 链接类型 find /dev -type l # b 块设备类型 find /dev -type b # c 字符设备类型 find /dev -type d # s 套接字类型 find /dev -type s # p 管道文件类型 find /dev -type p
-
按时间查找 -mtime
查找7天以前的文件(不会打印当天的文件) find ./ -type f -mtime +7 查找最近7天的文件(会打印当天的文件) find ./ -type f -mtime -7 查找第7天文件(不会打印当天的文件) find ./ -type f -mtime 7
例题:
查找/var/log下所有以.log结尾的文件,并保留最近七天的数据,剩余数据全部删除。find /var/log -type f -name "*.log" -mtime +7 -delete
我们通过find查找出来名称以.log结尾,且类型为文件的内容,然后将七天以前的数据列出来,最后通过 -delete 删除了7天以前的数据,变相的保留了最近7天的数据。#本地文件保留最近7天的备份文件, 备份服务器保留3个月的备份文件(实际使用方案) find /backup/ -iname "*.bak" -mtime +7 -delete find /backup/ -iname "*.bak" -mtime +90 -delete
-
按用户或用户组查找 -user,-group
#查找属主是oldQ的文件 find /home -type f -user oldQ #查找属组是pig_Q的目录 find /home -type d -group pig_Q #查找属主是oldQ, 属组是pig_Q find /home -user oldQ -group pig_Q #查找属主是oldQ, 并且属组是pig_Q find /home -user oldQ -a -group pig_Q #查找属主是oldQ, 或者属组是pif_Q find /home -user oldQ -o -group pig_Q #查找没有属主 find /home -nouser #查找没有属组 find /home -nogroup #查找没有属主或属组 find /home -nouser -o -nogroup
find动作处理
查找到一个文件后,需要对文件进行如何处理, find的默认动作是 -print
动作 | 含义/th> |
---|---|
打印查找到的内容(默认) | |
-ls | 以长格式显示的方式打印查找到的内容 |
-delete | 删除查找到的文件(仅能删除空目录) |
-ok | 后面跟自定义 shell 命令(会提示是否操作) |
-exec | 后面跟自定义 shell 命令(标准写法 -exec \;) |
#使用-print打印查找到的文件
find /etc -name "ifcfg*"
find /etc -name "ifcfg*" -print
#使用-ls打印查找到的文件,以长格式显示
find /etc -name "ifcfg*" -ls
#使用-delete删除文件,如果用来删除目录的话只可以删除空目录
find /etc -name "ifcfg*" -delete
#使用-ok实现文件拷贝,但会提示是否拷贝
find /etc -name "ifcfg*" -ok cp -rvf {} /tmp \;
#使用-exec实现文件拷贝和文件删除。
find /etc -name "ifcfg*" -exec cp -rvf {} /tmp \;
find /etc -name "ifcfg*" -exec rm -f {} \;
find命令结合xargs参数使用:
touch file.txt
find . -name "file.txt" |xargs rm -f
find . -name "file.txt" |xargs -I {} cp -rvf {} /var/tmp
使用 exec 来删除文件的话是一个一个来删除的,而是用 xargs 是一起删除,效率要高很多。我们可以做个测试看一下:
#创建以file-开头的1-9999的文件
touch file-{1..9999}
#使用exec来删除,显示删除使用时间
time find ./ -type f -name "file-*" -exec rm -rf {} \;
real 0m7.576s
user 0m3.596s
sys 0m3.902s
touch file-{1..9999}
#使用xargs来删除,显示删除使用时间
time find ./ -type f -name "file-*" | xargs rm -rf
real 0m0.169s
user 0m0.020s
sys 0m0.146s
特殊情况:记得文件的内容是什么,但是不清楚文件名称是什么,也不知道路径在哪,怎么办?
我们可以find 查找文件 通过 grep 筛选查找出来的文件内容
例如:
find /etc -type f | xargs grep "oldxu" --color=auto
查找/etc目录下,所有类型是文件的,然后将查找到的结果作为grep筛选条件的参数
find逻辑运算符
符号 | 作用/th> |
---|---|
-a或and | 逻辑与 |
-o或or | 逻辑或 |
-not或! | 逻辑非 |
#1.查找当前目录下,属主不是root的所有文件
find . -not -user root
find . ! -user root
#2.查找当前目录下,属主属于oldxu,并且大小大于1M的文件
find /etc -type f -user oldxu -size +1M
find /etc -type f -user oldxu -a -size +1M
find /etc -type f -user oldxu -and -size +1M
#3.查找当前目录下的属主为root或者以.txt结尾的普通文件
find . -type f \( -user root -o -name "*.txt" \) -ls