zoukankan      html  css  js  c++  java
  • Linux 文件查找

    文件查找

    locate 基于数据库来查找文件,是非及时性查找。通过数据库文件数据库位置 /var/lib/mlocate/mlocate.db来进行更新,使用updatedb命令可以更新数据库。

    locate 的搜索,只会依赖于事先构建的索引,索引的构建是在系统较为空闲时自动进行(周期性任务)。索引构建后的数据,不会立即生效,需要管理员手动更新数据库(updatedb)。索引构建过程需要遍历整个根文件系统,极消耗资源。

    locate特点:

    1 查找速度快

    2 模糊查找 包含关键字的也会显示

    3 非实时查找 只会基于上一次的索引,除非管理员手动更新数据库(updatedb)

    4 搜索的是文件的全路径,不仅仅是文件名 包含关键字的路径也会被显示出来。

    5 可能只搜索用户具备读取和执行权限的目录 如果要搜索的用户没有对a目标有rx权限,那么a目标不会显示。

    (rx,x代表能进,r代表能列)

    locate +关键字

    -i 不区分大小写的搜索

    -n N 只列举前N个匹配项目 示例: -n 2 表示只显示结果的前两个。

    -r 使用正则表达式

    示例:

    搜索名称或路径中带有“conf”的文件 # locate conf

    使用Regex(正则表达式)来搜索以“.conf”结尾的文件

    # locate -r ‘.conf$’

    find

    find查找工具 实时查找工具,通过遍历指定路径完成文件查找 如果什么条件都不指定,则将当前目录及子目录的

    所有文件都列出来。

    工作特点:

    1 查找速度略慢

    2 精确查找

    3 实时查找

    4 可能只搜索用户具备读取和执行权限的目录 如果要搜索的用户没有对a目标有rx权限,那么a目标不会显示。

    (rx,x代表能进,r代表能列)

    语法:

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

    查找路径:指定具体目标路径;默认为当前目录,且会递归。

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

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

    查找条件具体有如下几种:

    搜索层级 默认全部递归,不管被搜索的目录是几层都会全部递归。

    -maxdepth level 最大搜索目录深度,指定目录为第1级

    -mindepth level 最小搜索目录深度

    示例:

    # find -maxdepth 3 -name yangyang
    
    # 查找当前目录下名为yangyang的文件,但最多递归3层。这三层包含.(.是当前目录)
    
    # find -mindepth 2 -name yangyahg
    
    # 查找当前目录下名为yangyang的文件,但最少递归2层。这二层不包含.(.是当前目录)

    只在第n层目录内查找

    # find -maxdepth 2 -mindepth 2 -name yangyahg
    
    # 只在当前目录的第二层查找名为yangyang的文件。

    根据文件名和inode查找:

    -name "文件名称":支持使用glob(通配符) *, ?, [], [^]
    
    -iname "文件名称":不区分字母大小写
    
    -inum n 按inode号查找
    
    -samefile name 相同inode号的文件
    
    -links n 链接数为n的文件 任何一个目录的链接数至少是2,因为有.(当前目录)和..(上个目录)两个链接。所以可以得出,目录的硬链接数减去2,就是这个目录的子目录数量。
    
    -regextype posix-extended -regex "PATTERN(正则表达式)":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称
    
    # find /app -regextype posix-egerp -regex '/app/.(r..t)...1er' 前后的目录必须一致,否则报错.
    
    查找app目录下,前后名字都有r..t且一致的文件
    
    # root555rooter
    
    # find -regextype posix-extended -regex './.(r..t)...1er'是扩展正则,
    
    # ./aroot123rooter
    
    -regextype posix-basic -regex 是基本正则.
    
    -regextype posix-egerp -regex意思是使用和egrep一样的正则表达式,即扩展正则。

    根据属主、属组查找:

    -user USERNAME:查找属主为指定用户(UID)的文件
    
    # find -user yangyang
    
    # 查找属主是yangyang的文件
    
    -group GRPNAME: 查找属组为指定组(GID)的文件
    
    # find -group li
    
    # 查找属组是li的文件。
    
    -uid UserID:查找属主为指定的UID号的文件
    
    -gid GroupID:查找属组为指定的GID号的文件
    
    -nouser:查找没有属主的文件 因为用户被删除,所以看不到用户名了,但uid号还在的文件用此办法查看
    
    -nogroup:查找没有属组的文件 因为组被删除,所以看不到组名了,但gid号还在的文件用此办法查看

    根据文件类型查找: -type TYPE:

    f: 普通文件 示例 # find -type f # 显示所有普通文件
    
    d: 目录文件
    
    l: 符号链接文件 即软链接
    
    s:套接字文件 即网络端口通信文件。
    
    b: 块设备文件
    
    c: 字符设备文件 显示终端信息。
    
    p: 管道文件

    组合条件查找

    组合条件:默认是与的关系,即-a

    与:-a 或:-o 非:-not, ! !-a = -o (非与即或 )!-o = -a(非或即与)

    条件1 -a 条件2 同时满足这两个条件

    条件1 -o 条件2 满足其中给一个即可

    (非 A)或(非 B) =非(A且 B)

    (非 A)且(非 B) =非(A或 B)

    !A -a !B = !(A-o B) 非条件1与非条件2 等于 非(条件1或条件2)

    !A –o !B = !(A-a B) 非条件1和非条件2 等于 非(条件1或条件2)

    条件1 -o 条件2 相当于数学中的并集

    条件1 -a 条件2 相当于数学中的交集

    # find -not -name 条件1 -a -not -name 条件2,用基本正则可写为

    #find -not ( -name 条件1 -o -name 条件2 )

    find示例

    find -name snow.png  //查找当前目录下,名字精确为snow.png的文件,区分大小写
    
    find -iname snow.png  //查找当前目录下,名字精确为snow.png的文件,不区分大小写
    
    find /-name “*.txt”  //查找根目录下,名字包含以.txt结尾的文件
    
    find /var–name “*log*”  //查找var目录下,名字包含log的文件.
    
    find -user joe -group joe  //查找当前目录下,属主为joe,且属组为joe的文件
    
    find -user joe -not -group joe  //查找当前目录下,属主为joe,且属组不是joe的文件.
    
    find -user joe -o -user jane  //查找当前目录下,属主是joe或jine的文件
    
    find -not( -user joe -o -user jane )  //查找根目录下的,属主不是joe和jine的文件
    
    find / -user joe -o -uid 500  //查找根目录下,属主是joe或UID号为500的文件.

    找出/tmp目录下,属主不是root,且文件名不以f开头的文件

    find /tmp ( -not -user root -a -not -name 'f*' ) -ls
    
    find /tmp -not ( -user root -o -name 'f*' ) –ls

    排除目录示例:固定格式: -path ‘目录名’ -a -prune 排除一个指定目录查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件

    find /etc -path 'etc/sane.d' -a -prune -o -name '*.conf'

    查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的其它所有.conf后缀的文件

    find /etc ( -path '/etc/sane.d' -o -path 'etc/fonts' ) -a -prune -o -name "*.conf"

    根据文件大小来查找:

    -size [+|-]#UNIT

    常用单位:k, M, G,c(byte)

    输入单位#: (#-1, #] 大于等于#-1,到小于#之间。 中括号有大于等于的意思。小括号有小于的意思.

    如:6k 表示(5k,6k] 5K到6K之间。

    输入单位 -#:[0,#-1] 大于等于0.小于等于#-1

    如:6k 表示[0,5k]

    输入单位 +#:(#,∞) 大于等于#+1到正无限大,不包含输入的数值本身。

    如:+6k 表示(6k,∞)

    示例:

    查找大于5M的文件

    find -size +5M

    查找小于5M的文件

    find -size -6M

    查找大于5M,小于6M的文件

    find -size 5M

    附:创建指定大小的文件

    # dd if=/dev/zero of=/app/bigfile.img bs=1M count=5 bs是指定块的大小,count是块的个数。

    # 在/app/下创建了一个名为bigfile.img且大小为5M的文件。

    根据时间戳:

    以“天”为单位;

    -atime [+|-]#, -atime 最近一次的访问时间

    #: [#,#+1) #到#+1天前之间。

    -mtime 最近一次的修改时间

    +#: [#+1,∞] #+1天之前。 -ctime 最近一次的状态时间(权限,用户,组,大小,修改时间等)

    -#: [0,#) #天以内。

    -mtime -ctime 示例:查找app/目录下,10分钟之内时间戳发生改变的文件.

    # find /app -amin -10

    以“分钟”为单位:

    -amin -mmin -cmin

    根据权限查找: -perm [/|-]MODE (因为+从centos7开始淘汰,centos7里面只能用/来表示.)

    /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,是或的关系 举例:

    挑选出当前目录下.属主或属组或其他人权限上有写权限的文件.

    # find -perm /666

    # 属主上有r,rw,w权限之一的, 或 属组上有r,rw,w权限之一的 或 其他人上有r,rw,w权限之一的的都会被匹配到.

    r,rw,w三者满足其中之一即可,属主,属组,其他人只要有一项满足这些条件之一都符合.

    PS: 如果是find -perm /000的话,只有/000才能匹配的到.

    -MODE:每一类对象都必须同时拥有指定权限,是与的关系 举例:

    挑选出当前目录下.属主,属组,其他人权限上都有写权限的文件.

    # find -perm -222

    # 属主上有w rw,wx权限 且 属组上有w rw,wx权限 且 其他人上有w rw,wx权限的才会被匹配到.三者之间必须同时满足条件才会被匹配到.

    0 表示不关注,权限位为0的时候,使用或()关系判断的时候,会判断其他的权限位置.使用与(-)关系判断的时候,有一处权限位不符合都不会再判断.

    # rw------- 1
    
    # -----w---- 2
    
    # -------wx 3
    
    # r-------- 4
    
    # find -perm 600

    # 会匹配到1和4.

    因为6里面包括r和w,属主上包括r的只有1和4,而属组和其他上都是0,

    0表示不关心,故2和3虽然分别在其他人及属组上有符合的条件,但是不匹配.

    同理,如果匹配项是022的话,值会匹配2和3.

    find -perm 755 会匹配权限模式恰好是755的文件,与的关系时,仅匹配755.

    或的关系时候,任何一位上满足条件都会列出.

     

    只要当任意人有写权限时,find -perm +222就会匹配

    只有当每个人都有写权限时,find -perm -222才会匹配

    只有当其它人(other)有写权限时,find -perm -002才会匹配

     

    查找后的处理动作: 通常放在命令最后

    -print:默认的处理动作,显示至屏幕

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

    -delete:删除查找到的文件

    fls file:查找到的所有文件的长格式信息保存至指定文件中

    主要保存inode号,软链接次数,权限,之类的信息类似于ls -l后,显示的内容。

    -ok COMMAND {} ; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认(很烦人的操作)

    固定格式

    # find -name "*.sh" -exec chmod +x {} ;,将查找出来 *.sh 的文件加上执行权限x.

    其中 -exrc和;是固定格式,分别代表开始和结束,exec后面跟命令,{}当中固定引用参数。

    这里引用的参数就是 "*.sh"

    对当前目录下,所有f开头的文件做一个备份,备份名字为文件名.orig

    # find -name "f*" -exec cp {} {}.orig ;

    # 第一个{}是引用“f*”变量,第二个{}代表在当前目录下建立备份.orig。

    如果将 -exec 改为 -OK 的话,那么电脑会在每一步都会发出询问。

    参数替换:xargs

    find和xargs格式:find | xargs COMMAND(命令)

    由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所以就有了xargs命令

    xargs用于产生某个命令的参数,xargs 可以读入 stdin(标准输入) 的数据,并且以空格符或回车符将 stdin

    的数据分隔成为arguments(参数)

    注意:文件名或者是其他意义的名词内含有空格符的情况

    有些命令不能接受过多参数,命令执行可能会失败,xargs可以解决

    示例:

    ls f* |xargs rm 删除列出的文件
    
    find /sbin -perm +700 |ls -l 这个命令是错误的,ls不支持接受管道传递过来的参数.
    
    find /sbin -perm +7000 | xargs ls –l
    
    # echo “a b c d e” |xargs touch
    
    # 相当于touch a b c d e xargs当中的参数,会一个一个的交给它后面的命令。
    
    # find -name “*.conf” -exec cp {} {}.orig ;
    
    备份配置文件,添加.orig这个扩展名
    
    # find /tmp -ctime +3 -user joe -ok rm {} ;
    
    提示删除存在时间超过3天以上的joe的临时文件,-ok会每一步都提醒。
    
    # find ~ -perm -002 -exec chmod o-w {} ;
    
    在你的家目录中寻找可被其它用户写入的文件,并去除掉这个权限。
    
    # find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} ;
    
    在/date目录下的普通文件。权限为644且以。sh结尾的,给这写文件的权限改为755.
    
    # find /home –type d -ls
    
    # 列出家目录下的目录文件。
    
  • 相关阅读:
    页面滚屏截图工具推荐
    java总结第二次(剩余内容)//类和对象1
    happy birthday to tbdd tomorrow
    数组增删改查及冒泡
    三个循环方面程序
    三个入门小程序
    java总结第二次//数组及面向对象
    Java总结第一次//有些图片未显示,文章包含基础java语言及各种语句
    后台验证url是不是有效的链接
    img 鼠标滑上后图片放大,滑下后图片复原
  • 原文地址:https://www.cnblogs.com/OrochWang/p/9444367.html
Copyright © 2011-2022 走看看