写在前面
在面试时被问到了有关find命令的问题,由于时间长了有一些遗忘,今天重新的复习一下。
一、find语法结构及解释
语法:
find [查找路径] [查找条件] [找到后的处理动作]
查找路径:
具体要在哪里找,例如/ ,/tmp目录,默认为本目录下,可以不写,或者使用'.'来代替本目录。
查找条件:
查找的标准,可以是文件名、权限、日期等条件
处理动作:
找到制定文件后后续要作何操作,默认为打印输出,不写或-print均为打印输出。
二、查找条件
接下来介绍一些常用到的查找条件
1、按照文件名查找
-name "文件名" ,例如:-name '*.txt" 查找所有txt结尾的文件,区分大小写
-iname "文件名", 例如:-inane “*.Txt” 查找所有txt结尾的文件,不区分大小写。
2、按照文件类型查找
-type "TYPE"
TYPE可以为
f : 普通文件
d: 目录文件
l: 链接文件
s: 套接字文件
b:块文件
3、按照文件内容修改日期查找:
以天为单位: -mtime +# ; 例如:-mtime +7 表示7天前修改的文件
以分钟为单位: -mmin +# ;例如:-mmin +10 表示10分钟前修改的文件
4、按照属主属组查找:
-user USERNAME : 查找属主为指定用户的文件。
-group GROUPNAME: 查找属组为指定用户的文件。
-uid UserID:查找指定属主uid号的文件
-gid GroupID:查找指定属组uid号的文件
5、按照权限查找:
-perm MODE 例如:-perm 644 :按照644权限精确匹配查找文件。
在权限面前还可以加+-号来模糊匹配,但有些麻烦,且用的不多,在此暂不做考虑。
以上就是最常用的查找条件,当然这些条件在同一类型下也可以同时的出现多个,进行逻辑上的与或非的组合查找。
当多个查找类型的条件同时出现时,默认为与,例如-type f -name '1.txt' -perm 644,则要查找权限为644,且文件名为1.txt的普通文件。
逻辑符号的表示
与:-a 或:-o 非:!、-not
例1:
查找本目录下以txt或csv结尾的普通文件
find . \( -name "*.txt" -o -name "*.csv" \) -print
例2:
查找本目录下没有属组也没有属主的普通文件
find . \( -nouser -a -nogroup \) -print
例3:
查找本目录下文件名不是以txt结尾的普通文件
find . ! -name "*.txt" -print
附加逻辑技巧:
!A -a !B 等价于 ! (A -o B)
!A -o !B 等价于 ! (A -a B)
三、后续动作
查找完成后,需要有后续动作,因此下面来讨论“处理动作”
(默认)打印到屏幕上,可以不写 | |
-ls | 相当于将找到的结果做“ls -l "操作 |
-delete | 删除找到的文件 |
-exec COMMAND {} \; | 将找到的文件用shell命令进行处理。 例如:-exec mv {} {}_new \; 将查找到的文件的文件名后面加上"_new" ,此处{}代表的是找到的所有全体内容。 |
注意:
find命令会将找到的内容一次性的传递给后续的动作,而不是一个一个的传递。因此有一些shell命令不能一下子接受过多的参数而导致其失效。用下面方式可以避免此类情况的发生。
find | xargs COMMAND
四、简单练习
1、查找当前目录内文件以txt或dbf文件结尾的普通文件
find . -name "*.txt" -a -name "*.dbf"
2、查找/var目录下属主为root,且属组为mail的所有文件或目录
find /var -user root -a -group mail
3、查找/usr目录下属主不属于root、bin、hadoop的所有文件或目录
find /usr ! -user root -a ! -user bin -a ! -user hadoop
4、查找/etc目录下最近一周内内容没有被修改过,同时属主不为root,也不是hadoop的文件,删除这些文件
find /etc -mtime +7 -a -not \( -user root -o user hadoop\) -delete