大家好,我是“孤云幕雨”;祝大家中秋快乐,今天给大家带来的是《Linux文件查找命令》

一、locate:依赖于事先构建的索引

v  依赖于事先构建的索引;索引的构建是在系统较为空闲时自动进行(周期性任务);手动更新数据库:updatedb

v  数据库配置文件:/var/lib/mlocate/mlocate.db

v  索引构建过程需要遍历整个根文件系统,极消耗资源

v  实时查找:遍历所有文件进行条件匹配

v  非实时查找:根据索引查找

v  locate工作特点

Ü  模糊查找

Ü  优势:查找速度快

Ü  非实时查找(数据库查找)

v  只搜索用户具备读取和执行权限的目录

语法:locate 文件名

       locate KEYWORD

           locate [OPTION]... PATTERN...

选项:

      -i:查找时,不区分大小写

-b:只匹配路径中的基名

      -c:统计出共有多少个符合条件的文件

      -n N:仅显示前N个匹配条目


注意:索引构建过程需要遍历整个根文件系统,极消耗资源


二、find  实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找

v  find工作特点

Ü  查找速度慢

Ü  精确查找

Ü  实时查找

 

语法find 查找路径 查找条件

 find 查找路径 查找条件 处理动作

 find [选项] ... 查找路径 查找条件 处理动作

选项:

      -L: 遵循符号链接

      -P:不遵循符号链接

      -maxdepth LEVEL: 设置最大目录层级

      -mindepth LEVEL: 设置最小目录层级

 

v  查找路径:指定具体目标路径;默认为当前目录

v  查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件

v  处理动作:对符合查找条件的文件做出的操作;默认输出至屏幕


查找条件

根据文件名查找(支持使用glob风格的通配符)

v  -name FileName:根据文件名称进行查找

v  -iname FileName:根据文件名进行查找,不区分字符大小写

v  -depth: 从指定目录下最深层的子目录开始查找

v  -regex:支持正则表达式;以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称

[root@zhangdaifu ~]# find /etc -name network

/etc/sysconfig/network

/etc/rc.d/init.d/network

 

[root@zhangdaifu ~]# find /etc -maxdepth 3 -mindepth 3 -name network

/etc/rc.d/init.d/network

根据文件从属关系查找

    根据文件属主查找

    v  -user UserName查找属主为指定用户的文件

    根据文件属组查找

    v  -group GroupName查找属组为指定组的文件

    根据UID查找

    v  -uid UID查找属主为指定uid号的文件

    根据GID查找

    v  -gid UID查找属组为指定gid号的文件

    查找没有属主属组的文件

    v  -nouser查找没有属主的文件

    v  -nogroup查找没有属组的文件

根据文件类型查找

v  -type 文件类型(FILE_TYPE):指定文件类型进行查找

Ü  文件类型(FILE_TYPE

F  f:普通文件

F  d:目录文件

F  l:软链接文件

F  b:块设备文件

F  c:字符设备文件

F  p:管道文件

F  s:套接字文件


高级查找

组合条件查找

v  -a与;两个条件同时满足;默认(并且关系)

Ü  多个条件之间默认就是并且关系

v  -o或;两个条件满足一个即可(或者关系)

v  -not !非;条件取反

 

    .摩根定律

    v  A并且非B

    Ü  !A -a !B = !(A -o B)

    v  A或非B

    Ü  !A -o !B = !(A -a B)

根据文件系统查找

v  -fstype FileSystem_type: 只寻找该文件系统类型下的文件或目录

根据文件大小查找

v  开区间:不包括

v  闭区间:包括

Ü  (开区间)

Ü  [闭区间]

v  -size [+|-]#UNIT根据指定文件大小进行查找;选项后可以加“+-”加减号后加上数字,数字后面加单位,常用的单位有“kMG”;默认以字节为单位

Ü  #UNIT: (#-1, #]

Ü  -#UNIT[0,#-1]

Ü  +#UNIT(#,oo)

Ü  半开半闭区间:#UNIT: (#-1, #]>#-1<=#

Ü  闭区间:#UNIT[0,#-1],>0<=#-1

Ü  开区间+#UNIT(#,oo),>#

v  -expty寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录

根据时间戳查找

    以“天”为单位

    v  -atime [+|-]#访问时间

         大于等于#小于#+1

    Ü  #[#, #-1),>=3<4

    Ü  -#(#, 0], <#>0

    Ü  +#(oo, #-1], --oo>#-1

    Ü  -:在N天之内(包括N本身)被访问过的文件

    Ü  +:在N天之前(不包含N本身)被访问过的文件

    v  -mtime修改时间

    v  -ctima改变时间

    

    以“分钟”为单位

    v  -amin访问时间

    v  -mmin修改时间

    v  -cmin改变时间

根据权限查找

v  -perm [+|/|-] MODE:指定八进制权限位,查找对应的权限

Ü  MODE精确匹配

Ü  至少一类有 ! 所有都没有

Ü  所有都有 ! 至少一类没有

Ü  {+|/}:任何一类用户(ugo)的权限中的任何一位rwx)符合条件即满足(包含即为有,9位权限之间存在“或”关系;任何一位满足就行,隐藏着“或”关系

# find / -perm +003

不关心属主属组的权限、查找其他人能写或能执行的权限;0为不考虑

# find ./ -perm /222 –ls

      # 查找当前目录下,至少有一位用户有写权限的文件

Ü  -:每一类用户(ugo)的权限中的每一位(rwx同时符合条件即满足(9位权限之间存在“与”关系,隐藏着“与”关系

666(包含,包含,包含)

      766:符合

      760:不符合

find / -not -perm 222

至少有一类用户没有写权限

find / -perm -003

不关心属主属组的权限、其他人需同时拥有wx权限极为符合

    注:在RHEL 7/CentOS 7上“+”被废掉,被替换成“/

根据文件新旧查找

v  -newer

Ü  选项后+文件名+文件类型;查找比指定文件新的文件

Ü  选项前+逻辑非+文件类型;查找比指定文件旧的文件

Ü  选项后+文件1+逻辑非+选项+文件2+文件类型;查找比文件1新,比文件2旧的文件

根据Inode查找

v  -inum INODE根据Inode进行查找

v  -samefile NAME:查找相同Inode的文件

v  根据Inode删除文件

Ü  当文件名太复杂不好删除时,可以根据Inode将其删除

find . -inum INODE -print  -exec  rm  {}  -rf  \;

find . -inum INODE -print  -exec  rm -rf {} \;

根据文件被链接的次数进行查找

v  -links N:查找被[]链接N次的文件


处理动作

v  -print:默认的动作;将查找到的内容输出到标准输出(屏幕)

v  -ls:类似于对查找到的文件执行ls –l命令

v  -delete:删除查找到的文件;操作有风险,确认需谨慎

v  -fprint /PATH/TO/SOMEFILE:将查找到的文件保存到指定文件中,如果文件不存在则创建之

v  -fls /PATH/TO/SOMEFILE:查把查找到的所有文件的长格式信息保存至指定文件中

v  -ok COMMAND {} \; :对查找到的每个文件执行由COMMAND指定的命令;对于每个文件执行命令之前,都会交互式要求用户确认

v  -exec COMMAND {} \; :对查找到的每个文件执行由COMMAND指定的命令;无需用户确认!

v  {}:用于引用查找到的文件名称自身

 

注意:find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令;有些命令不能接受过多参数,此时命令执行可能会失败

另一种方式可规避此问题

语法格式find | xargs COMMAND

find命令练习

find命令练习 (1)

 

1、找出/tmp目录下属主为非root的所有文件

# find /tmp -not -user root

 

2、找出/tmp目录下文件名中不包含fstab字符串的文件

# find /tmp -not -iname '*fstab*'

 

3、找出/tmp目录下属主为非root,而且文件名不包含fstab字符串的文件

# find /tmp -not \( -user root -o -iname '*fstab*' \)

 

4、找出当前系统下文件名带有~的文件

      # find / -name *\~*


 

find命令练习 (2)

 

1、查找/var目录下属主为root,且属组为mail的所有文件或目录

# find /var -user root -group mail

 

2、查找/usr目录下不属于root,binzhangdaifu的所有文件或目录用两种方法

# find /usr -not -user root -not -user bin -not -user zhangdaifu

find /usr -not \( -user root -o -user bin -o -user zhangdaifu \)


3、查找/etc目录下最近一周内其内容修改过,且属主不是root用户也不是zhangdaifu用户的文件或目录

# find /etc -mtime -7 -not \( -user root -o -user zhangdaifu \)

 

4、查找当前系统上没有属或属组,且最近一周内曾被访问过的文件或目录

# find / \( -nouser -a -nogroup \) -a -atime -7

 

5、查找/etc目录下大于1M且类型为普通文件的所有文件

# find /etc -type f -size +1M

 

6、查找/etc目录下所有用户都没有写权限的文件

# find /etc -not -perm /222 -type f

 

7、查找/etc目录至少有一类用户没有执行权限的文件

# find /etc -not -perm -111 -type f

 

8、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的所有文件

# find /etc/init.d/ -perm -113 -type f

  find /etc/init.d/ -type f -perm -111 -a -perm -002


文件系统查找

findfs 通过标签或UUID查找文件系统

语法findfs LABEL=label

           findfs UUID=uuid

 

根据UUID进行查找

[root@localhost ~]# findfs UUID=6a7eb833-5bd7-4e73-8766-4de1607ecb90

/dev/sda5


根据卷标进行查找

[root@localhost ~]# findfs LABEL=DATA_DISKS

/dev/sdb