在开始解释find命令时,我们首先要明白一点:查找文件与文本过滤的区别
文本过滤是指根据某个pattern,过滤出文本内容中符合pattern的内容并按用户指定的方式处理。
查找文件是指根据某个pattern,查找出符合pattern的文件名。
根据下面的例子可以更好的理解查找文件与文本过滤的区别:
- # ls /var/log | grep ".*\.log" //显示文件名称本身的内容,首先会列举出 /var/log
- 目录下的所有文件的文件名,然后 在这些文件名中查找
- 符合以".log"结尾的文件名,即查找文件。
- grep “.*\.log” /var/log //表示/var/log是一个普通文件,查找出符合pattern的
- 字符串的行,即用于文本过滤。
用于查找文件的命令有locate和find:
locate:是用于模糊查找、非实时查找的,但是速度很快
使用格式:
locate KEYWORD
locate是在数据库中查找的(类似于whatis),使用updatedb可以更新locate的数据库
- # locate passwd //查找当前locate数据库中的文件名中包含passwd关键字的文件
find命令使用方法详解:
find命令功能:
1、用于精确查找
2、用于实时查找
3、可以指定路径查找
4、支持元字符通配
5、递归查找
使用格式:
find [查找路径...] [查找条件] [处理动作]
注意:查找路径省略:表示查找的是当前路径
查找条件省略:表示将查找到的所有文件根据后面的处理动作处理
处理动作省略:表示显示出来
- # find //后不接任何内容,表示将当前路径下的所有文件,以及子目录中的所有文件都
- 显示出来
下面我们来详细介绍一下find命令的查找条件:
根据文件名称查找:
-name "FILENAME"
-iname "FILENAME"
- //查找/etc目录下以passwd为文件名的文件,从输出的结果中可以看到find命令可以递归查询
- # find /etc -name "passwd"
- /etc/pam.d/passwd
- /etc/passwd
- //查找/etc目录下以"passwd*"、"*passwd*“为文件名的文件,这里使用到了glob通配
- # find /etc -name "passwd*" /etc/pam.d/passwd
- /etc/passwd
- /etc/passwd-
- # find /etc -name "*passwd*"
- /etc/security/opasswd
- /etc/pam.d/passwd
- /etc/passwd
- /etc/passwd-
注意:
(1)FILENAME要加引号(文件名可能会有空格),可以使用glob通配。
(2)-name是区分文件名称大小写,要想不区分文件名称大小写,要使用-iname
- //查找/var/log目录下的含有"[a-z]*"的文件名,并且不区分大小写
- # find /var/log -iname "[a-z]*"
根据正则表达式查找:
-regex "PATTERN" 使用正则表达式通配
-iregex "PATTERN" 使用正则表达式通配,而且不区分大小写
根据文件的属主/UID、属组/GID查找:
-user USERNAME 查找是以USERNAME为属主的文件名
-uid UID 查找uid=UID的文件名
-group GROUPNAME 查找是以GROUPNAME为属组的文件名
-gid GID 查找gid=GID的文件名
- //查找/tmp目录下以redhat为属主的文件
- # find /tmp -user redhat
- /tmp/test.txt
- /tmp/redhat.txt
我们现在把redhat这个用户删除,那么再执行上面的命令就会出错,但是使用uid指定redhat用户的UID就不会出错,而且会精确查到该文件。
- # userdel redhat //删除用户redhat
- # find /tmp -user redhat //查找/tmp目录下以redhat为属主的文件
- find: invalid argument `redhat' to `-user'
- # find /tmp -uid 501 //查找/tmp目录下uid=501的文件
- /tmp/test.txt
- /tmp/redhat.txt
根据文件没有属主、属组查找:
-nouser
-nogroup
- //查找/tmp目录下没有属主的文件
- # find /tmp -nouser
- /tmp/test.txt
- /tmp/redhat.txt
对于这些文件,谁都可以看到、修改,所有当看到这些文件,我们应尽量给它属主、属组。
根据文件的类型查找:
-type
f 普通文件
d 目录文件
l 软连接文件
b 块文件
c 字符文件
p 管道文件
s socket文件
- //查找/var/log目录下文件类型为目录的文件
- # find /var/log -type d
根据文件的大小查找:
-size [+/-]#
单位常用的有k,M,G,不指定的话,默认是k。
-size +number单位
-size number单位
-size -number单位
- //查找/etc目录下文件大小在大于1k小于2k的文件
- #ls -lh `find /etc -size 2k`
- //查找/etc目录下文件大小为小于2k的文件
- #ls -lh `find /etc -size -2k`
- //查找/etc目录下文件大小为大于2k的文件
- #ls -lh `find /etc -size +2k`
根据时间查找:
单位是day:
-atime 访问时间
-mtime 修改时间
-ctime 改变时间
单位是minute:
-amin 访问时间
-mmin 修改时间
-cmin 改变时间
- //查找/tmp目录下在210min内被访问过的文件
- #find /tmp -mmin -210
- //查找/tmp目录下在210min之前被访问过的文件
- #find /tmp -mmin +210
- //查找/tmp目录下恰好在距现在210min时被访问过的文件
- #find /tmp -mmin 210
根据权限查找:
-perm
mode 精确匹配
/mode 任何一位匹配都行(即给定的某个文件的属主、属组、其他有一个权限匹配到就行)
-mode 所有都得匹配(即给定的文件的权限大于等于给定的权限)
- //下面列举出了个文件的权限
- # ll
- total 24
- -rw-r--r-- 1 root root 0 Jun 20 20:16 a
- -rw-r----- 1 root root 0 Jun 20 20:16 b
- -r--r--r-- 1 root root 0 Jun 20 20:16 c
- -rw------- 1 root root 0 Jun 20 20:16 d
- -r-------- 1 root root 0 Jun 20 20:16 e
- -rw-rw-r-- 1 root root 0 Jun 20 20:16 f
- //查找当前目录下权限为640的文件
- # find -perm 640
- ./b
- //查找当前目录下属主权限为6,或属组权限为4,或其他用户的权限为0的文件
- # find -perm /640
- .
- ./a
- ./c
- ./d
- ./e
- ./f
- ./b
- //查找当前目录下权限大于或等于640的文件
- # find -perm -640
- .
- ./a
- ./f
- ./b
多条件查找:
需要考虑条件间的逻辑关系:
-a 并关系 (默认是表示并关系)
-o 或关系
!,-not 非关系
- //查找/etc目录下文件名称符合"*passwd*"并且属主是root的文件
- #find /etc -name "*passwd*" -user root
- //查找/tmp目录下文件名称符合"*passwd*"或属主是root的文件
- #find /tmp -name "*passwd*" -o -user redhat
- //查找/tmp目录下文件名称符合"*passwd*"或属主不是redhat的文件
- //注意:-not的优先级最高
- #find /tmp -name "*passwd*" -o -not -user redhat
- //查找/tmp目录下文件名称不符合"*passwd*"或属主不是root的文件
- #find /tmp -not -name "*passwd*" -o -not -user redhat
- #find /tmp -not \( -name "*passwd*" -a -user redhat \)
处理动作:
-print 默认
-ls 详细显示
-ok COMMAND {} \; 执行命令前提醒用户确认
-exec COMMAND {} \; 执行命令前不提醒用户确认
find | xargs COMMAND 通过标准输入送过来执行命令行中的命令。
- //对查找到的当前目录下的权限大于等于400的文件执行 "chown redhat" 操作
- #find ./ -perm -400 -exec chown redhat {} \;
- //对查找到的当前系统下的没有属主且没有属组的文件执行 "chown redhat:redhat" 操作
- #find / -nouser -a -nogroup -exec chown redhat:redhat {} \;
- //对查找到的当前目录下的权限大于等于002的文件执行重命名操作
- #find ./ -perm -002 -exec mv {} {}.old \;
- //对/tmp目录下文件名称为core并且文件类型为普通文件的文件执行删除操作
- #find /tmp -name core -type f -print | xargs /bin/rm -f
转载于:https://blog.51cto.com/smile2013/904150