• 【one day one linux】find 用法详解小记


    find命令的功能很强大,查找文件的选项很多,所以这是一个很实用并且很常用的linux命令。但是他有个缺点就是搜索的时候比较慢的。而与之相对的有一个locate命令。

    1. find的命令格式

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

      

      2. 命令参数:

              pathname : find命令所查找的目录路径。相对路径和绝对路径都可以的。

          -print:   find命令将匹配的文件输出到标准输出(默认就是将找到的文件输出到标准输出)

        -exec command {}  :  find命令对匹配的文件执行该参数所给出的command命令,注意"{}"与  ""之间的空格。

        -exec ok {} :   与exec命令参数差不多,只不过多了一个检查,在执行每一个命令之前要求用户来确认是否执行。

          

      3. 命令的选项:

        常用:

        -name filename :   查找名为filename的文件(常用的选项)

        文件属性:

        -perm  xxxx   :   按照xxxx代表的执行权限来查找

        -user   username :按照文件属主来进行查找

        -group  groupname: 按照文件属组进行查找 

        -nouser     查找无有效属主的文件,即属主在/etc/passwd中不存在的

        -nogroup         查找无有效属组的文件,即属主在/etc/groups中不存在的

        文件时间属性:

        -mtime -n +n   按照文件更改时间进行查找  ,  -n指n天以内   +n指n天以前

        -atime  -n  +n   按照文件访问时间来查找

        -ctime  -n   +n   按照文件创建时间来查找

          -newer  file1 ! file2  查找更改时间比file1新但是比file2旧的文件

         文件类型属性:

        -type   查找某一个类型的文件   

        b - 块设备目录

        d - 目录

        c - 字符设备文件

        p - 管道文件

          l - 符号链接文件

        f - 普通文件

         其他类型

        -size n [c] : 查找文件长度为n块的文件  ,带 c 的时候表示文件长度以字节计算。

        -depth:  查找文件的时候首先查找当前目录下,然后再查找其子目录。

        -fstype:  查找位于某一类型的文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本文件系统的信息。

        -mount : 在查找文件时不跨越文件系统mount点。(这句话不是太理解哈,等下实例中看下。)

        -follow :  如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。

        -cpio:  对匹配的文件使用cpio命令,将这些文件备份到磁盘设备中。

        -prune : 忽略某个目录

      

        另外,下面三个的区别:

        -amin n   查找系统中最后N分钟访问的文件

        -atime n  查找系统中最后n*24小时访问的文件

        -cmin n   查找系统中最后N分钟被改变文件状态的文件
        -ctime n  查找系统中最后n*24小时被改变文件状态的文件
        -mmin n   查找系统中最后N分钟被改变文件数据的文件
        -mtime n  查找系统中最后n*24小时被改变文件数据的文件

      4. 使用实例

      (1)-name选项

                比较常用的选项,并且可以使用匹配符或者正则表达式来匹配文件(匹配符与正则的区别需要注意下)。如果是具体的文件名可以引号引起来也可以不用引号,但是文件名匹配模式是一定要用引号引起来的。

        

    在根目录“/”下查找文件名为 "test.txt"的文件
    # find / -name  "test.txt"  -print

    #匹配符与正则表达式的应用:
    查找目录下所有的 “*.log”
    # find . -name "*.log" -print

    查找目录下以大写字母开头的文件
    # find / -name "[A-Z]*" -print

    查找一个以小写字母开头,数字结尾的文件
    # find / -name "[a-z]*[0-9]" -print

      

        (2)文件属性选项

          -perm   xxx   

    查找文件权限为755的文件,可以和-name混合使用
    # find / -perm  755 -print

    查找一个文件属主是root,属组也是root的文件(这种单独使用是没什么意义的,这都是一些限制条件混合使用)
    # find / -user root -group root -print

    当然还有查找属主和属组都已经被删除的文件
    # find . -nouser -nogroup -print

        (3)文件时间属性

    # 查找最后48小时内访问过的文件
    $  find / -atime  -2
    
    # 查找最后24小时内修改过的文件
    $  find / -mtime -1

        (4)忽略某个目录

    使用选项 -prune  支出忽略的目录。使用-prune选项的时候注意不要和-depth一起用,-prune会被忽略。

    #  忽略test目录下的hello目录
    $  find test  -path "test/hello" -prune -o -print 

    说明下:find  [-path] [expression]

    在路径列表后面是表达式

    find test  -path "test/hello" -prune -o -print
    -a 和 -o 是shell中的短路求值,与 && 和 || 结果类似。
    -path "test/hello" 为真,则求值-prune ,则与逻辑为真,后面的-print不需要执行,否则求值 -print(利用-o的短路特性)
    可以理解为如下所示的shell流程:
    if -path "test/hello" then
    -prune
    else
    -print
    

    忽略多个目录的操作:

    find  test  ( -path test/test4 -o -path test/test3 )  -prune  -o  -print 

    增加一个转义 ""

    查找某一确定文件,-name等选项加在-o 之后

    命令:

    find test (-path test/test4 -o -path test/test3 ) -prune -o -name "*.log" -print

       (5)组合使用:操作之后加入命令   find  pathname  -option  [-print ] [  -exec  -ok   command]  {} ;

    #查看当前目录下的所有普通文件并通过ls -l来显示详细信息
    $ find . -type f -exec ls -l {} ;
    
    #还可以再加一些条件,组合使用
    $ find logs  -type f -mtime +5 -exec -ok rm -rf {} 
    #删除五日以前有更改的文件  这个命令在运维的时候很有用,删除一些日志文件的时候。
    

    *有一个很好的应用场景是:find查找文件,然后grep看文件里面是否有我们需要的字段

    #在/tmp中寻找*.h,并在这些文件中查找"TEST"字段
    $ find /tmp -name *.h | xargs -n50 grep TEST
    $ find   /tmp   -name "*.h"   -exec grep "TEST"   {}   ; -print
    
    #将查找到的文件复制到指定地方
    $ find /tmp  -name test -exec cp '{}' /test ';'
    
    特殊文件可以使用cpio的
    $ find dir -name filename -print | cpio -pdv newdir  (暂时还不之后cpio的用法,先记录下来)
    
    
    #可以使用管道来处理find查找出来的 文件列表
    $ find ./ -name "*.php" | ls -l -full-time 2>/dev/null | grep "2016-07-03 22:39"
    查找2016-07-03 22:39更改过的文件
    

      

    -----

    参考链接:

    每天一个linux命令find

    linux find用法实例

    Linux Find 命令精通指南

    吴秦(Tyler)【日记小常】linux中强大且常用命令:find,grep

    25simple examples of Linux Find command

  • 相关阅读:
    【笔记】ubuntu下搜狗输入法的安装(12.04和14.04都会提到,侧重前者)
    【笔记,转载】c++ string与int的转化
    【笔记】关于字符串相加
    【转载】 C++ fstream文件流读写文件操作详解
    【转载】大数据分析的众包平台—Kaggle (如有侵权,请联系我)
    【转载】 生成模型与判别模型
    【杂记】递归缩写
    【笔记】给自己的博客侧栏添加小时钟
    【笔记】改变vim或者终端terminal的光标形状。光标变细了之后看起来爽快多了!
    【笔记】 使用GNU profiler查找性能瓶颈,查看代码中每个函数所消耗的时间
  • 原文地址:https://www.cnblogs.com/panhao/p/5615563.html
Copyright © 2020-2023  润新知