zoukankan      html  css  js  c++  java
  • 在Linux系统上查找文件

    Find命令

    格式:find <指定搜索范围> <指定条件> <指定动作>

    其中搜索范围是一个目录名,指定条件包括文件名、文件属性(修改时间所属用户等)、所在位置特点(如目录深度等)等;指定动作包括打印(-print)等;

    例如:find $HOME -name "*.sh",查找用户根目录下所有以.sh结尾的文件,除了按文件名查找,find还可以按文件大小、类型、所属用户、用户组、修改时间、是否为空等,还可以指定找到文件后要执行的动作, 例如下面第一个指令是找到文件后运行ls命令,第3个指令是查找文件名中有echo且不属于root的文件(可以用!表示取反):

    [godu@goduserver ~]$ find ./backup/nep -name "*echo*" -ls
    124059671 8 -rwxr-xr-x 1 godu  godu   192 5月 19 10:59 ./backup/nep/echoServerStart.sh
    [godu@goduserver ~]$ find ./backup/nep -name "*echo*" ! -user godu 
    [godu@goduserver ~]$ find ./backup/nep -name "*echo*" ! -user root 
    ./backup/nep/echoServerStart.sh
    find /proc/<pid>/fd -type s(找所有socket文件)结果为空,用-type l可知此目录下所有文件都为link文件。
    

    详见:linux查找文件命令find

    引号问题

    (2013-9-4更新)

    find -name 是glob格式,而且只匹配文件名,如果想用正则表达式匹配,则需要匹配完整路径名。

    例如有这样一个文件:./CalcServer/src/com/boco/deploy/ConfigLoader.java,用find . -name "Co*.java"可以匹配上,但find . -regex "Co.*java"匹配不上,因为它只匹配了文件名,而不是包括路径的完整路径名,改为find . -regex ".*Co.*java"就ok了。

    参考:http://bbs.chinaunix.net/thread-612012-1-1.html

    查找条件

    (2013-10-17更新)

    按时间特性查找

    • find -newerXY : 查找在某个时间点之后修改(更新,生成)的文件,例如:

      find . -newermt '2014-01-16 00:00' -name '*.py'

    查找所有修改时间晚于1月16日0点的扩展名为py的文件。

    • find -mtime -1: 查找最近一天内被更改过的文件;

    • mtime是按天查询,"-mtime -7" 查询修改时间在7天前到现在这段时间内的文件;

    • mmin是按分钟查询,其他与mtime一样;

    • atime, ctime分别是access time和change time(mtime是modification time),其他与mtime一样;

    • find -newer 列出所有修改时间晚于修改时间的文件;

    查找深度限制

    • -maxdepth 用来指定查询的目录深度,一般作为find的第一个参数;

    查找类型限制

    • "-type f" 表示只显示文件,"-type d" 表示只查询目录;另外还有l(链接),s(socket)等类型可选;

    指定动作

    • "-exec": 格式:

      • find -exec {} ; 上面{}代表被查出来的项目,命令以分号结尾,但为了避免分号在不同系统中的歧义,前面加反斜杠对分号进行转义;

      • find -exec {} + 将所有find找到的条目放在一起,由一次性执行,效率比"find ... ;"版本高很多;

    • "-print": 主要用来在管道命令中为其他命令传值;

    Locate命令

    相当于find -name,但速度远快于find,因为Linux维护了一个文件列表数据库(在Ubuntu上,这个数据库文件是/var/lib/mlocate/mlocate.db),locate命令查询这个数据库给出结果。由于数据库每天更新,所以如果查询最近的更改,需要手工更新数据库:

    sudo updatedb
    

    注意locate的搜索结果是包含路径的,所以用locate 'abc'是搜不到文件名以abc开头的文件的,必须写为"abc*";

    • 文件名部分普通匹配:locate strom;对应Emacs中M-x locate;

    只有在这种最简形式下,可以将locate 'strom'简写为locate storm;

    • glob匹配:locate 'strom.gz',搜索所有storm*.gz文件;

    • 正则匹配:locate -r '.Storm.java',或者:locate -r '.[Gg]roovy.';

    在特定路径下搜索指定扩展名文件:locate -r '.warez.[Vv]irtual[Bb]ox.*[rpm|deb]'

    用正则指定文件扩展名:locate -r 'Storm.*.java'

    • locate+grep效果很好,先用locate进行粗选,然后在grep中细化,如查抄版本号为2.2.0的一个Hadoop安装包:locate 2.2.0|grep hadoop,或者查找所有文件名为Groovy或者groovy的文件:locate -r '[Gg]roovy'|grep '[Gg]roovy'

    Ref:

    Linux的五个查找命令

    5 Ways To Search For Files Using The Terminal

  • 相关阅读:
    tty初探 — uart驱动框架分析
    是否要从单片机转为嵌入式Linux?
    Linux 下Input系统应用编程实战
    Linux设备驱动之Kobject、Kset
    Xorg-xserver相关知识
    linux各级目录
    GitHub使用基本流程
    6、Linux发行版组成与初识
    CentOS7安装出现Warning
    Python数据类型之变量
  • 原文地址:https://www.cnblogs.com/darkmatter/p/3605594.html
Copyright © 2011-2022 走看看