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 p_w_picpaths.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 精确匹配