阿Q的Linux运维学习之路(day16)-Linux文件查找-find

find概述

有些时候我们需要用上一些文件,但是却忘了这个文件的具体所在位置,这个时候就需要用到文件查找。
find命令是Linux下必须掌握的命令,find命令可以通过不同的条件来精确定位到我们想要查找的文件,任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

find语法格式:
find 路径 选项 表达式 动作

常用选项:
  1. 按名称查找 -name

    #查找/etc/目录下包含ifcfg-ens32名称的文件
    [root@localhost ~]#  find /etc/ -name ifcfg-ens32
    /etc/sysconfig/network-scripts/ifcfg-ens32
    
    #使用-iname查找时不区分大小写
    [root@localhost ~]#  find /etc/ -iname ifcfg-ens32
    /etc/sysconfig/network-scripts/ifcfg-ens32
    /etc/sysconfig/network-scripts/IFCFG-ens32
    
    #查找/etc/目录下所有以ens32结尾的文件
    [root@localhost ~]#  find /etc/ -name *ens32
    /etc/sysconfig/network-scripts/ifcfg-ens32
    /etc/sysconfig/network-scripts/IFCFG-ens32
    
    #查找/etc/目录下所有以ifcfg开头的文件
    [root@localhost ~]# find /etc/ -name ifcfg*
    /etc/sysconfig/network-scripts/ifcfg-lo
    /etc/sysconfig/network-scripts/ifcfg-ens32
    
  2. 按文件大小查找 -size

    #查找大于5M的文件
     find /etc -size +5M
    
    #查找小于5M的文件
     find /etc -size -5M
    
    #查找大小为5M的文件
     find /etc -size 5M
    
  3. 按文件类型查找 -type

    # f 文件类型
     find /dev -type f
    
    # d 目录类型
     find /dev -type d 
    
    # l 链接类型
     find /dev -type l
    
    # b 块设备类型
     find /dev -type b
    
    # c 字符设备类型
     find /dev -type d
    
    # s 套接字类型
     find /dev -type s
    
    # p 管道文件类型
     find /dev -type p
     
    
  4. 按时间查找 -mtime

    查找7天以前的文件(不会打印当天的文件)
     find  ./ -type f -mtime +7
    
    查找最近7天的文件(会打印当天的文件)
     find  ./ -type f -mtime -7
    
    查找第7天文件(不会打印当天的文件)
     find  ./ -type f -mtime 7
    

    例题:
    查找/var/log下所有以.log结尾的文件,并保留最近七天的数据,剩余数据全部删除。

    find /var/log -type f -name "*.log" -mtime +7 -delete
    我们通过find查找出来名称以.log结尾,且类型为文件的内容,然后将七天以前的数据列出来,最后通过 -delete 删除了7天以前的数据,变相的保留了最近7天的数据。

    #本地文件保留最近7天的备份文件, 备份服务器保留3个月的备份文件(实际使用方案)
    find /backup/ -iname "*.bak" -mtime +7 -delete
    find /backup/ -iname "*.bak" -mtime +90 -delete
    
  5. 按用户或用户组查找 -user,-group

    #查找属主是oldQ的文件
     find /home -type f -user oldQ
    
    #查找属组是pig_Q的目录
     find /home -type d  -group pig_Q
     
    #查找属主是oldQ, 属组是pig_Q
     find /home -user oldQ -group pig_Q
     
    #查找属主是oldQ, 并且属组是pig_Q
     find /home -user oldQ -a -group pig_Q
     
    #查找属主是oldQ, 或者属组是pif_Q
     find /home -user oldQ -o -group pig_Q
     
    #查找没有属主
     find /home -nouser
     
    #查找没有属组
     find /home -nogroup
     
    #查找没有属主或属组
     find /home -nouser -o -nogroup
    
find动作处理

查找到一个文件后,需要对文件进行如何处理, find的默认动作是 -print

动作 含义/th>
-print 打印查找到的内容(默认)
-ls 以长格式显示的方式打印查找到的内容
-delete 删除查找到的文件(仅能删除空目录)
-ok 后面跟自定义 shell 命令(会提示是否操作)
-exec 后面跟自定义 shell 命令(标准写法 -exec \;)
示例:
#使用-print打印查找到的文件
 find /etc -name "ifcfg*"
 find /etc -name "ifcfg*" -print

#使用-ls打印查找到的文件,以长格式显示
 find /etc -name "ifcfg*" -ls

#使用-delete删除文件,如果用来删除目录的话只可以删除空目录
 find /etc -name "ifcfg*" -delete

#使用-ok实现文件拷贝,但会提示是否拷贝
 find /etc -name "ifcfg*" -ok cp -rvf {} /tmp \;

#使用-exec实现文件拷贝和文件删除。
 find /etc -name "ifcfg*" -exec cp -rvf {} /tmp \;
 find /etc -name "ifcfg*" -exec rm -f {} \;

find命令结合xargs参数使用:

 touch file.txt
 find . -name "file.txt" |xargs rm -f
 find . -name "file.txt" |xargs -I {} cp -rvf {} /var/tmp

使用 exec 来删除文件的话是一个一个来删除的,而是用 xargs 是一起删除,效率要高很多。我们可以做个测试看一下:

#创建以file-开头的1-9999的文件
 touch file-{1..9999}
#使用exec来删除,显示删除使用时间
 time find ./ -type f -name "file-*" -exec rm -rf {} \;

real	0m7.576s
user	0m3.596s
sys	0m3.902s

 touch file-{1..9999}
#使用xargs来删除,显示删除使用时间
 time find ./ -type f -name "file-*" | xargs rm -rf

real	0m0.169s
user	0m0.020s
sys	0m0.146s

特殊情况:记得文件的内容是什么,但是不清楚文件名称是什么,也不知道路径在哪,怎么办?

我们可以find 查找文件 通过 grep 筛选查找出来的文件内容
例如:

find /etc -type f | xargs grep "oldxu" --color=auto
查找/etc目录下,所有类型是文件的,然后将查找到的结果作为grep筛选条件的参数

find逻辑运算符
符号 作用/th>
-a或and 逻辑与
-o或or 逻辑或
-not或! 逻辑非
示例:
#1.查找当前目录下,属主不是root的所有文件
 find . -not -user root 
 find . ! -user root
        
#2.查找当前目录下,属主属于oldxu,并且大小大于1M的文件
 find /etc -type f -user oldxu -size +1M
 find /etc -type f -user oldxu -a -size +1M
 find /etc -type f -user oldxu -and -size +1M

#3.查找当前目录下的属主为root或者以.txt结尾的普通文件
 find . -type f \( -user root -o -name "*.txt" \) -ls
发布了38 篇原创文章 · 获赞 0 · 访问量 585

猜你喜欢

转载自blog.csdn.net/qq_39095114/article/details/104959929