欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

linux中文件查找的常用命令

程序员文章站 2022-04-13 09:05:11
文件查找 小编在学这堂课的前一天夜里打嗝打了半宿,第二天上课的时候迷迷糊糊,所以,导致文件查找这章我放了好久的鸽子。 这里是回看视频摘出来的笔记。如有理解有偏差,请留言。 本篇只有3个命令,重点是find,时间有限的朋友可以只看find命令。这太过重要了。 whereis命令 在一些特定的目录搜索, ......

文件查找

小编在学这堂课的前一天夜里打嗝打了半宿,第二天上课的时候迷迷糊糊,所以,导致文件查找这章我放了好久的鸽子。

这里是回看视频摘出来的笔记。如有理解有偏差,请留言。

本篇只有3个命令,重点是find,时间有限的朋友可以只看find命令。这太过重要了。

 

whereis命令
        在一些特定的目录搜索,搜索二进制文件、帮助文件、源文件等

        选项:
                        不加任何选项就会列出所有文件。
            -b            只搜索二进制文件
            -m            只搜索帮助文件
            -s            只搜索源文件
            -l            列出whereis搜索的路径,也就是whereis会在这些路径下搜索内容
            -u            不是上述三类文件的其它类型文件。
       



locate命令
        用来快速搜索文件的工具,是根据索引数据库搜索的。数据路位置/var/lib/mlocate/mlocate.db
        
        1、新系统可能没有这个数据库,updatedb命令可以手工更新数据库
        2、updatedb这个命令会消耗大量的io    需要在系统不繁忙的时候更新
        3、updatedb命令会根据/etc/updatedb.conf的设定取搜索硬盘内的文件名,并保存在/var/lib/mlocate目录下的数据库内。
        
        locate命令            主要用来搜索静态文件
            -i        不区分大小写搜索
            -r        使用基本正则表达式
            -b        只搜索文件名,而不搜索全路径。默认是搜索全路径
            -c        计数
            -n #    只显示前几个搜索结果
            -s        显示locate数据库信息
        
            备注:
                locate不能指定文件搜索路径,要想指定搜索路径需要手工使用正则表达式指定,祥看示例
                locate不是实时搜索,而且是模糊搜索
                locate默认会搜索文件的全路径,不仅仅是文件名,意思是如果目录包含某个关键词,目录下的所有文件都会被搜索到
                locate只会搜索当前用户能访问到的目录,意思是如果某个用户对某个目录没有访问权限,该目录就不会被搜索
            示例说明:指定搜索路径{
                [root@centos7 scripts]#locate -r "^/data/scripts/.*\.sh"
                /data/scripts/foot.sh
                /data/scripts/adddescrption.sh
                /data/scripts/arg.sh
                /data/scripts/arg2.sh
                /data/scripts/argsnum.sh
                /data/scripts/backup_etc.sh
                /data/scripts/bim.sh
                /data/scripts/checkdisk.sh
                /data/scripts/checkint.sh
                /data/scripts/createuser.sh
                /data/scripts/df_warning.sh}

find命令
        实时查找,精确查找,查找条件丰富,只搜索具有权限的目录
        
        find [options]  [查找路径]    [查找条件]    [处理动作]
            默认是递归搜索,默认是搜索当前目录
        

选项:
            -maxdepth #         最大搜索深度,指定搜索目录下搜索到第几级
            -mindepth #        最小搜索深度,
            
            -depth或-d        一般是先搜索文件夹,再去搜索文件夹内的文件。如果加上该选项-d,就会先搜索文件,在搜索目录

 

查找条件:
            根据文件名搜索
                -name 文件名      根据文件名搜索,精确匹配而不是模糊搜索。支持通配符
                        如果想要模糊搜索,可以使用   "*文件名*"   建议在使用通配符的时候要加上双引号,要不会产生各种莫名奇妙的问题
                -iname 文件名      不区分大小写搜索
                -inum inode         根据inode节点号搜索,可以用来搜索硬链接
            
                -samefile 文 件名     搜索相同节点编号的文件,需要注意的是,需要搜索同一分区内的相同节点编号
                -links    #          根据链接数为#这个条件进行搜索
                -regex "pattern"      以pattern匹配整个文件路径,而非文件名称
            
            根据属性信息搜索
                -user    用户名         根据所有者搜索
                -group    组名          根据所属组搜索
                -nouser    用户名     搜索没有所有者的文件
                -nogroup 组名        搜索没有所属组的文件
                -uid   uid               根据uid查找
                -gid   gid               根据gid查找
            
            根据文件类型搜索
                -type  type            根据文件类型搜索
                    type:
                        d            查找文件类型为目录的所有文件
                        f            查找文件类型为普通文件的所有文件
                        p            查找文件类型为管道文件的所有文件
                        s            查找文件类型为套接字的所有文件
                        c            查找文件类型为字符设备的所有文件
                        b            查找文件类型为块设备的所有文件
                        l            查找文件类型为软连接的所有文件
                        
                        
            搜索空文件或目录
                -empty                搜索空文件或者文件夹
            
            
            组合条件
                -a    与            默认就是按照并且条件搜索多个条件
                -o    或
                -not|!  非
                        
                因为与的优先级高于或的优先级,可以使用()扩起或的选项以提高或的优先级,()需要转义写成\( \)
            
                德*摩根定律:
                    (非a)或(非b)=非(a且b)
                    (非a)且(非b)=非(a或b)
                
            排除特定目录搜索
                -path 排除文件夹路径 -a -prune -o -name 文件名    指定不搜那些文件夹
                  例:

        find / \( -path "/sys" -o -path "/proc"\) -a -prune -o -name "*.conf"
                
                  # 搜索除/proc和/sys目录以外的所有路径下的以.conf结尾的文件
                    find / \( -path "/sys" -o -path "/proc" \) -a -prune -o -name "*.conf"
            
            根据文件大小搜索
                -size [+|-] #unit
                        常用单位k m g c(byte)  注意大小写
                    6k    表示 (5k,6k],包括6k不包括5k
                    -6k     表示 [0k,6-1k],包括0k也包括5k,两个之间
                    +6k     表示(6k,oo),不包含6k
                    
                    
                    -size 1024k和-size 1m的区别
                        -size 1024k        会搜索到1023k到1024k之间的文件
                        -size 1m        会搜索到0到1m之间的文件
            
            根据时间戳查找
                -atime [+|-]#
                    +10    表示11天以前的文件
                    -1    表示最近一天内的文件
                    10    表示10天到11天内,
                -mtime [+|-]#
                -ctime [+|-]#
                
                -mmin  [+|-]#    表示按分钟搜索
                -amin  [+|-]#
                -cmin  [+|-]#
            
            根据权限搜索
                -perm [/|-] mode    
                    mode:精确权限匹配
                    /mode    任何一类(u g o)对象的任何一位权限(r w x)中,只要能匹配一位权限就能搜索到,是或的关系
                    -mode    表示任何一类(u g o)对象的权限中r w x三者都完满条件才匹配,是并且的关系
                    
                    如果mode中三类对象中有一位是0,表示对应该类对象无论有没有权限无所谓
                备注,在centos7后,+的写法开始淘汰,使用/代替了
        
                find -perm 755          会精确搜索权限是755的文件
                find -perm /222      只要任何一类用户有写权限就会匹配。或者说,至少有一类用户有写权限就会匹配
                find -perm /111      只要任何一类用户有写权限的就会匹配。或者说,至少有一类用户有执行权限就会匹配
                find -perm /666      只要任何一类用户有读或者有写权限就会匹配。
                find -perm /001      其他用户有执行权限的文件才会匹配
                find -perm /002      其他用户有写权限的文件才会匹配
                find -perm -222      只有当文件的所有者、所属组、其他人三类用户都有写权限才会匹配
                find -perm -002      只要其它人具有写权限就会匹配,和find -perm /002的作用相同
                find -perm -022      所属组和其他人都具有写权限就会匹配
                find -perm 002       只匹配 --- --- -w-权限的文件
       

处理动作
            -print            默认,会把搜索结果打印屏幕,默认是以空格作为分割符。可以使用pring0选项改成使用nul作为分隔符
            -ls                把搜索的文件的详细属性显示出来
            -fls /path/to/file        查找到的每个文件长格式显示保存至指定文件,相当于 -ls > /path/to/file
            -delete            把搜索到的文件删除,太危险,慎用
            
            -ok command {} \;    对查找到的每个文件交由command指定的命令执行,但是在执行前会交互式提问
            -exec command {} \;    对超找到的每个文件交由command指定的命令执行,不会交互提问直接执行
                    {} 指的是find搜索的的文件,可以想成一个变量,此变量引用find搜索到的文件
                    \;    交由command执行 必须要有\;结束
                    
                find /data -exe rm {} \        删除搜索到的文件
                find /var -size +10m -mtime +10 -ok mv {} /data \    把在var下搜索到的大于10m时间超过10天之前的文件移动到data目录下
                find /data -name "*.txt" -exec cp {} {}.bak \;        批量加后缀。注意双{}的使用
            
            小技巧:利用find 和 mv 组合批量加后缀名:
          

                [root@centos7 tmp]# ll
                total 0
                -rw-r--r-- 1 root root 0 may  3 05:40 a
                -rw-r--r-- 1 root root 0 may  3 05:40 b
                -rw-rw-rw- 1 root root 0 may  3 05:40 c
                -rw-r--r-- 1 root root 0 may  3 05:40 d
                -rw-r--r-- 1 root root 0 may  3 05:40 e
                -r-------- 1 root root 0 may  3 05:40 f
                -rw-r--r-- 1 root root 0 may  3 05:40 g
                [root@centos7 tmp]# find . -type f -exec mv {} {}.haha \;        #小技巧利用find和mv组合批量加后缀名
                [root@centos7 tmp]# ll
                total 0
                -rw-r--r-- 1 root root 0 may  3 05:40 a.haha
                -rw-r--r-- 1 root root 0 may  3 05:40 b.haha
                -rw-rw-rw- 1 root root 0 may  3 05:40 c.haha
                -rw-r--r-- 1 root root 0 may  3 05:40 d.haha
                -rw-r--r-- 1 root root 0 may  3 05:40 e.haha
                -r-------- 1 root root 0 may  3 05:40 f.haha
                -rw-r--r-- 1 root root 0 may  3 05:40 g.haha
                [root@centos7 tmp]# 

 

 


  练习:
        1、查找/var目录下属主为root,且属组为mail的所有文件或目录;
            find /var -user root -a -group mail -ls
        
        2、查找/usr目录下不属于root,bin或hadoop的所有文件或目录;用两种方法;
            find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls
            find /user -not -user root -a -not -user bin -a -not -user hadoop -ls
        
        3、查找/etc目录下最近一周内其内容修改过,且属主不是root用户也不是hadoop用户的文件或目录;
            find /etc -mtime -7 -a -not -user root -a -not -user hadoop -ls
            find /etc -mtime -7 -a -not \( -user root -o -user hadoop \) -ls
        
        4、查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录;
            find \( -nouser -o -nogroup \) -a -atime -7 -ls
        
        5、查找/etc目录下大于1m且类型为普通文件的所有文件;
            find /etc/ -size +1m -a -type f -ls
        
        6、查找/etc目录下所有用户都没有写权限的文件;
            find /etc -not -perm /222 -type f -ls
        
        7、查找/etc目录至少有一类用户没有执行权限的文件;
            find /etc -not -perm -111 -type f -ls
        
        8、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的所有文件;
            find /etc/init.d -perm -113 -type f -ls