find命令:
在Linux文件管理中,find的命令是个很强大的实时查找工具,通过遍历指定路径下文件系统层级结构完成文件查找。
特性:查找速度慢(因为从根目录开始查找)、精确查找、实时查找。
用法:
find [OPTION] [查找起始路径] [查找条件] [处理动作]
查找起始路径:指定具体搜索目标起始路径,默认为当前目录;
查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等等标准进行;默认为找出指定路径下的所有文件;
1. 查找条件:
表达式:选项和测试
测试:结果通常为布尔型("true", "false")
根据文件名查找:
-name "pattern"
例如:find /etc -name "passwd" #精确匹配文件名,以passwd命名的文件
-iname "pattern" :不区分文件名中的大小写,支持glob风格的通配符 *,?,[],
例如:
find /etc -iname "passwd" #不区分大小写查找passwd命名的文件或目录
find /etc -iname "*passwd" #查找文件名以passwd结尾的文件或目录
find /etc -iname "passwd*" #查找文件名以passwd开头的文件或目录
-regex pattern;基于正则表达式查找
根据文件从属关系查找:
-user USERNAME:查找属主为指定用户的所有文件;
例如: find /tmp -user shakura #查找tmp目录下shakura用户的文件或目录
-group USERNAME:查找属组为指定组的所有文件;
例如:find /tmp -group root #查找tmp目录下属组为root的文件文件或目录
-uid UID:查找属主指定的UID的所有文件;
例如:find /tmp -uid 1003 #查找tmp目录下用户id为1003的文件或目录
-gid GID: 查找属组为指定的GID的所有文件;
-nouser: 查找没有属主的文件;
-nogroup:查找没有属组的文件;
注意:如果你将系统中的某个账号删除了,但是该账号又在系统内创建了很多文件就 可以使用-nouser命令将这些文件找出来了;
例如:find ./ -nouser(#-nogroup) #在根目录下查找没有属主、属组的文件或目录
根据文件类型查找:
-type TYPE
文件的主要类型有:普通文件(f)、目录文件(d)、符号连接文件(l)、
设备文件(b:块 设备文件、c:字符设备文件)、套接字文件(s)、管道文件(p)
例如:find /var -type s #查找/var目录下文件类型为Socket的文件
组合测试:
与:-a
或:-o
非:-not
根据文件大小查找:
-size[+|-]#UNIT
常用单位:k,M,G
#UNIT:(#-1, #] #以50k为例,比50k小1K或等于50k的文件
-#UNIT:[0,#-1] #以50k为例,比50k小的文件(不包含)
+#UNIT:(#,+OO) #以50k为例,比50k大的文件(不包含)
根据时间戳查找:
以“天”为单位:-mtime、-ctime、-atime
-atime [+|-]#:n
#:[#,#-1) #天之前”一天之内“被访问过的文件
+#:(oo, #-1] #天之前(不含#天)被访问过的文件
-#:(#, 0] #天之内(含#天)被访问过的文件
以“分钟”为单位:-amin、mmin、cmin;(同上,这里不再赘述)
根据权限来查找:
-perm [+|-]mode
mode:精确权限匹配;
例如:查找权限为755的文件或目录,只能匹配到的权限为rwxr-xr-x的文件。
+mode:任何一类用户(u,g,o)的任何一位权限(r,w,x)符合条件即满足;
9位权限之间存在“或”关系;
例如:查找权限为755的文件,即rwxr-xr-x,权限为rw-------的文件也满足条件。
-mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足;
9位权限之间存在“与”关系;
例如:查找权限为744的文件,即rwxr--r--,权限为rw-r-xr-x的文件也满足条件。
2.处理动作
对符合查找条件的文件做出的操作,例如删除等操作,默认为输出至标准输出。
-print:输出至标准输出;默认的动作;
-s:类似于对查找到的文件执行"ls -l"命令,输出文件的详细信息;
-delete: 删除查找到的文件;
find -name 1.txt -delete #查找文件名为1.txt的文件并删除
-fls /PATH/TO/SOMEFILE: 把查找到的所有文件的长格式信息保存至文件中;
例如:
[root@localhost ~]# find /var/log -fls /1.txt | cat /1.txt
786433 4 drwxr-xr-x 12 root root 4096 Dec 19 19:01 /var/log
786437 4 drwx------ 2 root root 4096 Mar 16 2015 /var/log/ppp
786451 4 drwx------ 2 root root 4096 Jul 24 19:53 /var/log/httpd
786448 4 -rw------- 1 root root 591 Dec 19 19:01 /var/log/maillog
786473 8 -rw-r--r-- 2 root root 6772 Dec 19 19:01 /var/log/boot.log
# 查找/var/log目录下的文件,将文件信息的长格式信息保存至1.txt文件中,用cat命令查
看1.txt文件的内容,输出信息如上图所示;
-ok COMMAND {} \; :对查找到的每个文件执行由COMMAND表示的命令;每次操作都 与用户进行确认;
例如:find ./ -nouser -a -nogroup -ok chmod root:root {}\;
#查找在根目录下无属主、属组的文件并将属主、属组该为root
-exec COMMAND{}\; :对查找到的每个文件执行由COMMAND表示的命令,直接修改完成
find ./ -perm /002 -exe c mv {} {}.dangereous \;
#查找其他用户有写权限的文件并在文件名后添加后缀dangerous
注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令。但是有些命令不能接受过长的参数,此时命令执行会失败,另一种方式可规避此问题;