• Shell脚本攻略之命令之乐(find)


    1.文件查找与文件列表

    find命令的工作方式如下:沿着文件层次结构向下遍历,匹配符合条件的文件,执行相应的操作

    实例:

     find . -print
    # . 指定当前目录  ..指定父目录   打印文件和目录的列表    -print指明打印出匹配的文件名(路径),'
    '作为用于对输出的文件名进行分隔   -print0指明使用''作为匹配的文件名之间的定界符

    2.根据文件名或正则表达式进行搜索:

    find /home/chunyu -name "*.txt" -print
    
    #选项-name的参数指定了文件名所必须匹配的字符串,-iname(忽略大小写)
    #可以把通配符作为参数使用,"*.txt"能够匹配所有以.txt结尾的文件名

    如果想匹配多个条件中的一个,可以采用OR条件操作:

    find . ( -name "*.txt" -o -name "*.pdf" ) -print
    
    #find命令能够匹配所有这两类文件
    #  (  以及   )用于将 -name  "*.txt" -o "*.pdf" 视为一个整体

    3.匹配文件路径:

     find /home/chunyu -path "*/chunyu/*" -print
    #选项-path的参数可以使用通配符来匹配文件路径
    
    #-path将文件路径作为一个整体进行匹配

    4.基于正则表达式来匹配文件路径:

     find . -regex ".*(.py|.sh)$"
    
    #-iregex可以让正则表达式忽略大小写

    5.基于目录深度的搜索:find命令在使用时会遍历所有的子目录,我们可以采用深度选项-maxdepth和-mindepth来限制find命令遍历的目的深度,-maxdepth和-mindepth应该作为find的第三个参数出现

    find . -maxdepth 1 -name "f*" -print
    
    #只允许find在当前目录中查找,深度可以设置为1;
    #当需要向下两级时,深度可以设置为2
    
    #可以指定一个最小深度,告诉find应该从此处开始向下查找
    
    #上述命令,列出当前目录下的所有以f开头的文件,即使有子目录,也不会被打印和遍历

    6.根据文件类型搜索:Unix类系统将一切视为文件,文件具有不同的类型,例如普通文件,目录,字符设备,块设备,符号链接,硬链接,套接字以及FIFO等

    find . -type d -print
    
    #-type可以对文件搜索进行过滤,指明特定的文件匹配类型
    
    #普通文件  f
      符号链接  l 
      目录        d 
      字符设备   c
      块设备      b 
      套接字      s
      FIFO        p

    7.根据文件时间进行搜索:Unix和Linux文件系统中的每一个文件都有三种时间戳,Unix中并没有所谓“创建时间”的概念

    访问时间(-atime):用户最近一次访问文件的时间

    修改时间(-mtime):文件内容内容最后一次被修改的时间

    变化时间(-ctime):文件元数据(例如权限和所有权)最有一次改变的时间

    find . -type f -atime -7 -print
    
    #-atime  -mtime -ctime可以作为find的时间选项
    
    #它们可以用整数值来指定,单位是天
    
    #这些数值通常还可以带有  +和-  ,+表示大于多少天,-表示小于多少天
    
    #上述命令,打印出最近7天内被访问的所有文件

    其他一些基于时间的参数是以分钟作为计量单位

    -amin(访问时间-分钟)

    -mmin(修改时间-分钟)

    -cmin(变化时间-分钟)

    find . -type f -amin +7 -print
    
    #打印出访问时间超过7分钟的所有文件

    find的另一个漂亮的特性是 -newer参数,使用 -newer 我们可以指定一个用于比较时间戳的参考文件,然后找出比参考文件更新的(更近的修改时间)所有文件

     find . -type f -newer catTest.sh -print

    8.基于文件大小的搜索:

    find . -type f -size +2k
    #同理,+2k表示大于2kb的文件搜索,-2k表示小于2kb的文件进行搜索
    #其他文件大小单元
       b  块(512字节)
       c  字节
       w  字(2字节)
       k   1024字节
       M   1024K字节
       G    1024M字节

    9.删除匹配的文件

    find . -type f -name  "*.swp" -delete
    #选项-delete可以用来删除find查找的匹配文件

    10.基于文件权限和所有权的匹配

    find . -type f -perm 644 -print
    
    #-perm 指明find应该只匹配具有特定权限值的文件
    
    find . -type f -name "*.php" ! -perm 644 -print
    
    #用上述命令可以搜索出没有设置好执行权限的PHP文件

    根据文件所有权进行搜索:

     find . -type f -user chunyu -print
    
    #打印出用户chunyu拥有的所有文件,参数USER可以是用户名或者UID

    11.利用find命令执行命令或动作:find命令可以借助选项-exec与其他命令进行结合

    sudo find /home/chunyu -type f -user root -exec chown chunyu {} ;
    
    #注意这里运行命令必须使用sudo,才有权限修改文件所属权限
    
    #在这个命令中,{}是一个与-exec选项搭配使用的特殊字符,对于每一个匹配的文件,{}会被替换成相应的文件名
    
    #例如find的命令找到两个文件test1.txt和test2.txt,其所有者均为root那么find就会执行:chown chunyu test1 和chown chunyu test2.txt

     -exec能够同printf结合来生成有用的才输出信息:

    find . -type f -name "*.txt" -exec printf "Text file:%s
    " {} ;

    12.让find跳过特定的目录:

    find PycharmProjects/ShellCute ( -name ".git" -prune ) -o ( -type f -print )
    
    #以上命令打印出不包括在.giut目录中的所有文件的名称(路径)
    
    #( -name ".git" -prune )的作用是用于进行排查,它指明了.git目录应该被排除在外  而  ( -type f -print ) 指明了需要执行的动作

  • 相关阅读:
    如何使用websocket实现前后端通信
    影响MySQL的性能(一)磁盘的选择
    springboot结合日志门面SLF4j和日志实现Logback的使用
    分享一个猜数字小游戏的脚本
    关于drop table *** purge (drop后不过回收站)
    关于DateBase link(dbLINK)及同义词
    关于数据更新(update)
    关于insert into(插入值)
    关于wm_concat(把一列的值,通过','进行分隔后,合并成一个值进行显示)
    关于PIVOT(用于行转列)
  • 原文地址:https://www.cnblogs.com/hqutcy/p/8862232.html
Copyright © 2020-2023  润新知