Linux中find命令用来在指定目录下查找文件。通过组合不同参数可以在linux系统中快速查找需要的文件或目录。
find命令语法
格式:find pathname -options [ -print | -exec | -ok | -print0 ]
pathname: 查找路径设置
options: 选项。每一个选项前面都会带一个横杠-,常用选项如下:
-name:按照文件名来查找文件(大小写匹配敏感),后面跟完整文件名或者文件模式,用双引号包含。
-iname:按照文件名来查找文件(忽略大小写),后面跟文件名或者文件模式,用双引号包含。
-mtime [ n| -n| +n ]:按照文件的更改时间来查找文件,n表示天数。分别表示第n天、n天以内及n天以前。
-type [ f| d| b| c| p| l ]:查找某一类型的文件。比如f-文件,d-目录(常用),b-设备文件,c-字符设备文件,p-管道文件,l-符号链接文件。
-size n[B|KB|M] :查找大小为n的文件,n表示文件大小,可以带单位。比如+100M表示查找大于100M文件,-100M表示查找小于100M文件,100M表示查找等于100M文件
-depth:查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-maxdepth:控制查找目录层级数。如果使用,该参数通常放在第一个。比如在当前目录查找-maxdepth 1。
-prune: 不在当前指定的目录中查找,如果同时使用了-depth选项,那么-prune选项会被忽略
-print: find命令将匹配的文件输出到标准输出。
-print0: 可以处理文件名包含空格情况,建议find与xargs结合时使用。
-exec: 对匹配的文件执行该参数所给出的shell命令。相应的目录形式为'command' {} ;,注意{}和;之间的空格
-ok: 有提示,很少用。
find查找实例
(1)按文件名查找
find /etc -name "*.txt" #在/etc目录下以.txt后缀的文件
find /etc -name "[A-Z]*" #在/etc目录下查找以大写开头的文件
find /etc -name "host*" #在/etc目录下查找以host开头的文件
find . -maxdepth 1 -type f -name "*.txt" -o -name "*.unl" #查找当前目录下txt和unl后缀的文件
find . -maxdepth 1 -type f ( -name "*.txt" -o -name "*.unl" ) #同上
(2)按时间范围查找
find /home -type f -mtime 5 #查找/home目录下第5天修改的文件
find /home -type f -mtime -5 #查找/home目录下5天内修改的文件
find /home -type f -mtime +5 #查找/home目录下5天前修改的文件
find /home -type f -cmin +5 #查找/home目录下5分钟前修改的文件
(3)按文件类型查找
find /etc -type f #查找/etc目录下所有的普通文件
find /etc -type d #查找/etc目录下所有的目录
find /etc ! -type d #查找/etc目录下所有非目录类型文件
find /etc -type l #查找/etc目录下所有的符号链接
(4)按文件大小查找
find /home -type f -size 100M #查找/home目录下等于100M的文件
find /home -type f -size +100M #查找/home目录下大于100M的文件
find /home -type f -size -100M #查找/home目录下小于100M的文件
(5)按文件属主、属组查找
find /tmp -user oracle #在/tmp目录下查找属主为oracle的文件
find /etc -group dba #在/etc目录下查找属组为dba的文件
(6)忽略指定目录查找
find -path /opt/bin -prune -o -type f "*.tar.gz" -print #忽略单个目录
find / -maxdepth ( -path /opt -o -path /var ) -prune -o -type f "*.tar.gz" -print #忽略多个目录
find组合命令实例(xargs&exec)
(1)查找并删除
find . -type f -name "*.aud" -print0 | xargs -0 -n 5000 rm #查找当前目录下所有的.aud文件并删除
find . -type f -name "*.aud" -exec rm -f {} ; #同上
find . -maxdepth 1 -name "*.tar.gz" -exec rm -rf {} ; #查找当前目录下大于100M的.tar.gz文件包并删除
find /home -type f -mtime +7 -exec rm {} ; #查找/home目录中更改时间在7日以前的普通文件并删除
(2)查找包含指定内容的文件
find / -type f -print | xargs grep "device" #查找包含device单词的文件
find / -type f -name "*.cfg" -print | xargs grep -l "127.0.0.1" #查找包含127.0.0.1的.cfg后缀的配置文件
(3)查找并替换文件内容
find / -type f -name "*.cfg" -print | xargs sed -i 's/127.0.0.1/192.168.0.1/g' #查找包含127.0.0.1的.cfg后缀的配置文件并将127.0.0.1替换为192.168.0.1
(4)查找及其他相关操作
find / -type f -size 0 -exec ls -l {} ; #查找大小为0的文件,并列出完整路径
find . -type f -name "*.txt" -exec mv {} /tmp ; #将查找到的.txt文件移动到/tmp目录
find /etc -perm -7 -print | xargs chmod o-w #在/etc目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限
find . -type f -name ".txt" -exec cp {} -C {}.bak ; #备份所有.txt文件。这是使用两个{}的方式