首页 > 代码库 > find&locate
find&locate
find&&locate命令详解
文件查找
locate,find
在文件系统上查找符合条件的文件
一、locate:
locate passwd
根据事先构建的索引,实现文件查找
所有包含passwd的路径都会显示出来
依赖于事先构建好的索引库;
系统自动实现(周期性任务)
手动更新数据库(updatedb)
工作特性:
查找速度笔记快
模糊查找
非实时查找//使用的数据库,可能是以前的数据库,没有更新过
locate [OPTION] ... PATTERN...
-A //符合所有PATTERN
-b //只匹配基名
-c //匹配到的文件个数
-r //使用基本正则表达式
注意:索引构建过程需要遍历整个根文件系统,极消耗系统资源
updatedb //更新locate搜索库
二、find
实时查找供,通过遍历指定起始路径下文件系统层级结构完成文件查找
工作特性:
查找速度略慢
精确查找
实时查找
用法:
find [OPTIONS] [查找起始路径] [查找条件] [处理动作]
查找起始路径:指定具体搜索目标起始路径,默认为当前目录
查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等等标准进行;默认为找出指定路径下的所有文件
处理动作:默认为输出到标注输出
查找条件:
表达式:选项和测试
测试:结果通常为布尔型(“true”,“FALSE”)
1.根据文件名查找
-name “pattern” //文件名
-iname “pattern” //忽略大小写
支持glob风格的通配符
*,?,[],[^]
-regex pattern //基于正则表达式查找文件,匹配范围是整个路径,而非基名
非常少用
2.根据文件的属主和属组
-user USERNAME 属主为
-group GRPNAME 属组为
-nouser 没有用户
一个用户创建文件后,删除该用户,以前属主为该用户的文件,的属主会变成该用户原来的UID
-nogroup
-uid UID:查找属主指定的UID的所有文件
-gid GID:查找属组指定的GID的所有文件
3.根据文件的类型查找
-type TYPE:
f,d,l,b,c,p,s
find /dev/ -type b -ls //-ls显示详细信息
4.组合测试
与:-a 默认组合条件
find /tmp -nouser -type f -ls
find /tmp -nouser -a -type f -ls
或:-o
非:-not或者!
find /tmp -not -type f
5.根据文件的大小查找:比我小的我敢
-size [+|-]#UNIT //小于但包括自己
常用单位:k,M,G
-size 10k //9.01k到10k之间,都会匹配到(#-1,#]之间,半开半闭区间
-#UNIT://小于,且不包括
-size -10k //[0-9k]
+#UNIT://大于且不包括
-size +10k //(#,无穷大)
--------|----------|--------
-UNIT UNIT +UNIT
[0,#-1] (#-1,#] (#,oo)
6.根据时间戳查找//stat查看
以“天”为单位:
-atime [+|-]#
#:过去多少天访问过的文件
#:[#,#-1)//大于
三天之前的事:
-atime # //(96h,72h]之内的时间,的时候
-atime -3 //(72h,0h] 三天之内的事情
-atime +3 //(oo,96h] 三天之前
find /etc/ -atime +7 //一周之内没有被访问过
-mtime 修改时间
find /etc/ -mtime -1 //24h之内修改过的
-ctime 改变时间
以“分钟”为单位
-amin
-mmin
-cmin
7.根据权限查找
-perm [/|-] mode
mode:精确权限匹配
find ./ -perm 644 /必须是
/mode //任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足
find ./ -perm /666 //全都匹配,只要有一个满足即可
find ./ -perm /222 //查找至少一类用户有写权限的文件
-mode //每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足;
同时包含该权限
/mode 一般:-mode:包含即可,mode完全对照
或者 与 且
find ./ -not -perm -222 -ls
//至少有一个没有w权限
//所有都有,至少一个没有
处理动作
-print;输出至标准输出,默认的动作;
-ls;类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息
-delete:删除查找到的文件
-fls /PATH/TO/SOMEFILE :匹配到的所有文件的长格式信息保存到指定文件中
-ok COMMAND {} \; : 对查找到的每个文件由COMMAND表示的命令
{} 占位符,引用前面的文件
find ./ -nouser -ok chown wolf.wolf {} \;
-exec COMMAND {} \; //和ok作用一样,但是不需要用户确认
find ./ -perm /022 -exec mv {} {}.txt \;
{}的作用是用来引用之前匹配到的文件名
注意:find传递查找到的文件路径至后面的命令的时候时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令
但是有些命令不能接受过长的参数,此时命令执行会失败,另一种方式可规避此问题
find | xargs COMMAND
课外作业:xargs的用法
xargs 可以读入 stdin 的资料,并且以空白字元或断行字元作为分辨,将 stdin 的资料分隔成为 arguments 。
find /sbin -perm +700 |xargs ls -l
xargs -a test echo //-a读入一个标准文件,输出没有断行,
cat txt | xargs -n2 echo //n命令在执行的时候,用2个argument
-e flag 注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
1.txt
aaa bbb ccc ddd a b
$ xargs -E ‘ddd‘ -a 1.txt echo
aaa bbb ccc //ddd为结束符,
cat 1.txt -n2 echo
aaa bbb
ccc ddd
a b //默认分隔符为空格,每两个为一行
-t 先打印命令
ls ./ | xarg. j/件名
find ~ -name ‘*.log‘ -print0 | xargs -0 rm -f
3. 假如你有一个文件包含了很多你希望下载的URL, 你能够使用xargs 下载所有链接
# cat url-list.txt | xargs wget –c
4. 查找所有的jpg 文件,并且压缩它
# find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz
5. 拷贝所有的图片文件到一个外部的硬盘驱动
# ls *.jpg | xargs -n1 -i cp {} /external-hard-drive/directory
三、练习:
1.找出/tmp目录下属主为非root的所有文件
2.找出/tmp下文件名中不包含fstab字符串的文件
3.找出/tmp下属主为root,而且文件名不包含fstab字符串的文件
find /tmp/ ! -user root
find /tmp/ ! -name "*fstab*"
find /tmp ! -user root -a ! -name "*fstab*"
find /tmp -not \( -user root -o -iname "*fstab*" \) -ls
//使用的是通配符
1.查找/var目录下属主为root,且属组为mail的所有文件或目录
2.查找/usr目录下不属于root,bin或hadoop的所有文件或目录,用两种方法
3.查找/etc目录下最近一周内其内容修改过,且属主不是root用户也不是hadoop用户的文件或目录
4.查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或者目录
5.查找/etc目录下大于1M且类型为普通文件的所有文件
6.查找/etc目录下所有用户都没有写权限的文件
7.查找/etc目录至少由一类用户没有执行权限的文件
8.查找/etc/init.d下,所有用户都有执行权限,且其他用户有写权限的所有文件
1.find /var -user root -a -group mail
2.find /usr -not -user root -a -not -user bin -a -not -user hadoop
find /usr -not \( -user root -o -not -user bin -o -not -user hadoop \)
3.find /etc -mtime -7 -a -not -user root -a -not -user wolf
4.find / \( -nouser -o nogroup \) -atime -7 -ls
5.find /etc -size +1M -a -type f -ls
find /etc -size +1M -a -type f -exec ls -lh {} \;
6.find /etc/ -not -perm /222 -ls //权限中不包含写权限
7.find /etc/test/ -not -perm -111 -type f -ls
//所有用户多有执行权限
8.find /etc -perm -111 -a -perm -002
find /etc -perm -113 -type f -ls
注意:所有都没有===至少一个有
权限: - mode //由歪变直
/640 任何一类用户(ugo)的任何一位满足即可
- 必须包含
mode 精确匹配
find&locate