一切皆文件,这句linux的最高哲学思想,注定了对文件的学习是linux学习中的重点之一;我们每天和各类文件打交道,但文件系统错综复杂,文件名品类繁多,你是否经常遇到忘记某个文件的路径或文件名?我想这是一个无法回避的问题,所以有一个快速准确高效的文件查找工具对我们来说是意义重大的;接下来梳理两种我们日常用得较多的文件查找工具,方便自己日后的查找和使用;
首先是locate命令:findfiles by name
Locate是一个依赖于事先构建好的索引库进行文件查找的工具,具有以下三个特性:
1.查找速度快:之所以locate具有高效的查找效率,是因为locate利用事先构建好的索引库进行检索,不需要遍历文件系统;
2.非实时查找 :而正是因为locate利用索引库进行检索,索引库是系统周期性地更新,所以locate无法做到实时查找;
3.模糊查找:这个很好理解,locate在查找时,不需要做到精确匹配,文件名中含有pattern字符串即可;
注意:我们在使用时也可以使用updatedb命令手动更新文件索引库,但是更新索引库需要遍历整个文件系统,极其耗费资源;
格式及常用选项:
格式:locate [OPTION]...PATTERN...
常用选项:
-b:只匹配文件基名(basename);
-c:统计出符合条件选项的文件个数;
-r,--regexp:支持正则表达式的格式进行检索;
总的来说,locate命令具有明显的优势,也具有突出的短板;接下来说说更常见,应用更为广泛,功能也更强大的文件查找工具:find;
Find:实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找;
工作特性:
1. 查找速度略慢:因为需要遍历整个文件系统,所以速度相对locate较慢;
2. 精确查找:除了字符串匹配,还有很多的匹配条件,可以做到相对精确的查找;
3. 实时查找:直接遍历文件系统,实时查找;
用法:find [ OPTIONS ] [查找起始路径] [查找条件 ] [处理动作];
查找起始路径:
指定具体搜索目标所在的路径;默认为遍历整个根目录;这样指定有利于减小查找的范围,提高效率,较少资源消耗;
查找条件:
指定的查找标准;根据文件名,大小,类型,从属关系,权限等;默认为找出指定路径下所有文件;
匹配文件名/pattern/;
-name“PATTERN” 支持glob通配符机制;
-iname “PATTERN”不区分大小写;支持glob通配符机制;
-regex pattern:基于正则表达式查找文件,匹配的是整个路径,而非基名;
根据文件的从属关系查找:
-user:查找属主为指定用户的所有文件;
-group:查找属组为指定组的所有文件;
-uid:查找属主为指定uid的所有文件;
-gid:查找属组指定的gid的所有文件;
-nouser:查找没有属主的文件;
-nogroup:查找没有属组的文件;
根据文件类型查找:
-type:f;d;l;b;c;p;s;
组合测试:
与:-a,默认组合条件;
或:-o,一个条件满足就行了;
非:-not,!;
例如:查找tmp目录下属主不是root,并且文件名含有fstab字符的文件;
find /tmp -not \( -uid 0 -o -iname"*fstab*" \);
根据文件大小查找:
-size[+|-]=unit,常用单位:k,m,G;
#unit:(#-1,#]
-#unit:[0,#-1]
+#unit:(#,oo);
根据时间戳来查找:
以天为单位:(下面的#都表示过去时间,为负更好理解;)
-atime:
#:(#-1,#]
-#:(#,0]
+#:(oo,#-1]
-mtime:
-ctime:
以分钟为单位:
-amin:
-mmin:
-ctime:
根据权限来查找:
-perm(/|-)mode:
mode:精确权限匹配;
/mode:任何一类用户(u,g,o)的权限中的任何一位符合条件及满足;九位权限之间存在“或”关系;
-mode:每一类用户的权限中的每一位同时符合条件即可;九位权限之间存在“与”关系
注意:find /PATH/TO/FILE -perm /|-### /和-两个选项,为0的权限位可以直接忽略,不用作相应匹配;
处理动作:对符合条件的文件做出的,例如删除(-delete);默认为输出至标准输出;经常使用的是列出(-ls)找到文件的具体信息;
处理动作;
-print:输出至标准输出;默认动作;
-ls:类似与对查找到的文件执行“ls -l”,输出文件的详细信息;
-delete:删除,危险!
-okCOMMAND {} \; :对找到的每个文件执行command命令;每次操作由用户确认;
-exec COMMAND {} \; :对找到的文件直接执行命令,没有交互动作;
几个练习题:
查找/usr目录下不属于root,bin或hadoop的所有文件或目录,两种方法;
查找/etc目录下最近一周内容修改过,且属主不是root也不是hadoop的文件或目录;
查找系统下最近一周被访问过,而且没有属主或属组的文件或目录;
注意这里加了-o有可能会影响到后面的选项;
查找/etc下大于1M且类型为普通文件的目录;
查找/etc下所有用户都没有写权限的文件;
查找/etc下至少有一类用户没有执行权限的文件;
查找/etc/init.d/目录下,所有用户都有执行权限,且其他的用户有写权限的所有文件;