一切皆文件,这句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:[0,#-1] +#unit:(#,oo); 根据时间戳来查找: 以天为单位:(下面的#都表示过去时间,为负更好理解;) -atime: -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/目录下,所有用户都有执行权限,且其他的用户有写权限的所有文件;
|