• linux命令之find查找文件


    find

    find 用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

    语法

    find  path  -option  [ -print ]   [ -exec   -ok   command ]   {} \;
    

    上面的 find的常用形式可以简化为:

    find [path...] [expression]
    
    • path:所查找的目录路径。例如,用.来表示当前目录,用/来表示系统根目录

    • expression:可以分为 “-options [-print -exec -ok ...]”

      • -options,指定find命令的常用选项,下节详细介绍
      • -print,find命令将匹配的文件输出到标准输出
      • -exec,find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格
        find ./ -size 0 -exec rm {} \; 删除文件大小为零的文件 (还可以以这样做:rm -i find ./ -size 0find ./ -size 0 | xargs rm -f &
      • 为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中:find . -type f -exec ls -l { } \;
        在/logs目录中查找更改时间在5日以前的文件并删除它们:find /logs -type f -mtime +5 -exec rm { } \;
      • -ok,和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
        find . -name "*.conf" -mtime +5 -ok rm { } \; 在当前目录中查找所有文件名以.conf结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示

    参数

    expression 中可用选项非常之多

    • -mount, -xdev : 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件
    • -amin n : 在过去 n 分钟内被读取过
    • -anewer file : 比文件 file 更晚被读取过的文件
    • -atime n : 在过去n天内被读取过的文件
    • -cmin n : 在过去 n 分钟内被修改过
    • -cnewer file :比文件 file 更新的文件
    • -ctime n : 在过去n天内被修改过的文件
    • -empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name
    • -ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写
    • -name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写
    • -size n : 文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。
    • -type c : 文件类型是 c 的文件
    文件类型 说明
    d 目录
    c 字符设备
    b 块设备
    p 管道
    f 普通文件
    l 符号链接
    s 套接字文件

    实例

    (1)根据文件名查找

    -name //根据文件名查找(精确查找)
    -iname //根据文件名查找,但是不区分大小写

    这里另外介绍下文件名通配符的知识

    *表示通配任意的字符

    find /etc -name "*passwd"     
    

    ?表示通配任意的单个字符

    find /etc -name "passwd?"
    

    [ ] 表示通配括号里面的任意一个字符

    find /etc -name "[ab].sh"
    

    (2)根据文件所属用户和组来查找文件

    -user //根据属主来查找文件
    -group //根据属组来查找文件

    (3)根据 uid 和 gid来查找用户

     find  /tmp  -uid  500  //查找uid是500 的文件
     find  /tmp  -gid  1000 // 查找gid是1000的文件
    

    (4)-a and -o and –not的使用

    ps:有用

    -a 连接两个不同的条件(两个条件必须同时满足)
    -o 连接两个不同的条件(两个条件满足其一即可)
    -not 对条件取反的

    find /tmp -name "*.sh" -a -user root
    find /tmp -not -user root
    

    (5)根据文件时间戳的相关属性来查找文件

    可以使用stat命令来查看一个文件的时间信息
    如下:

    stat /etc/passwd
    

    -atime
    -mtime
    -ctime
    -amin
    -mmin
    -cmin

    所以这里atime, mtime, ctime就是分别对应的 “最近一次访问时间” “最近一次内容修改时间” “最近一次属性修改时间”,这里的atime的单位指的是“天”,amin的单位是分钟

    find /tmp –atime +5      //表示查找在五天内没有访问过的文件(也就是5天前天没访问的文件)
    find /tmp -atime -5      //表示查找在五天内访问过的文件
    

    ps:在清理日志的时候,一般使用的是——最近一次内容修改的时间

    find -mtime +30 -name "*[0-9]*" -exec rm {} \;
    

    (6)根据文件类型来查找文件 -type

    f // 普通文件

    d //目录文件

    l //链接文件

    b //块设备文件

    c //字符设备文件

    p //管道文件

    s //socket文件

    find /tmp -type s
    

    (7)根据大小来查找文件 -size

    find /tmp -size 2M       //查找在/tmp 目录下等于2M的文件
    find /tmp -size +2M      //查找在/tmp 目录下大于2M的文件
    find /tmp -size -2M      //查找在/tmp 目录下小于2M的文件
    

    (8)根据文件权限查找文件 -perm

    find /tmp -perm 755      //查找在/tmp目录下权限是755的文件
    find /tmp -perm +222     //表示只要有一类用户(属主,属组,其他)的匹配写权限就行
    find /tmp -perm -222     //表示必须所有类别用户都满足有写权限
    

    (9)-nouser and -nogroup

    find / -nogroup –a –nouser    //在整个系统中查找既没有属主又没有属组的文件(这样的文件通常是很危险的,作为系统工程师的我们应该及时清除掉)
    

    查找完执行的action

    -print //默认情况下的动作

    -ls //查找到后用ls 显示出来

    -ok [commend] //查找后执行命令的时候询问用户是否要执行

    -exec [commend] //查找后执行命令的时候不询问用户,直接执行

    find /tmp -name "*.sh" -exec chmod u+x {} \;
    

    这里要注意{}的使用:替代查找到的文件

    find /tmp "*.sh" -exec cp {} {}.old \;
    

    删除查找到的超过30天没有访问过文件

    find  /tmp  -atime  +30  –exec rm –rf  {}  \; 
    

    也可以使用xargs来对查找到的文件进一步操作

    find /tmp -name "*.old" | xargs chmod 700
    

    案例详细说明

    • 删除文件命令
    find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \;
    
    • 实例命令
    find /opt/soft/log/ -mtime +30 -name "*.log" -exec rm -rf {} \;
    
    • 说明

    将 /opt/soft/log/ 目录下所有30天前带".log"的文件删除。具体参数说明如下:

    1. find linux的查找命令,用户查找指定条件的文件;

    2. /opt/soft/log/:想要进行清理的任意目录;

    3. -mtime:标准语句写法;

    4. +30:查找30天前的文件,这里用数字代表天数;

    5. "*.log":希望查找的文件名正则表达式,"*.jpg"表示查找扩展名为jpg的所有文件,"*"表示查找所有文件,这个可以灵活运用,举一反三;

    6. -exec:固定写法;

    7. rm -rf:强制删除文件,包括目录;

    8. {} ; :固定写法,一对大括号+空格+\+;

    附录

    每日一令之一

    linux下find命令的总结

  • 相关阅读:
    MYSQL数据库常用语句
    node.js(http协议)
    web 后端规范与思想
    linux系统下开启一个简单的web服务
    linux基础学习之软件安装以及常用命令(三)
    Vue如何使用动态刷新Echarts组件
    linux基础学习之软件安装以及常用命令
    linux基础学习
    浅谈FIle协议与Http协议及区别
    vueJs的简单入门以及基础语法
  • 原文地址:https://www.cnblogs.com/happyhuangjinjin/p/15864741.html
Copyright © 2020-2023  润新知