文章目录

  • 1、Linux中查找文件命令(超实用)
  • 1、grep : 查看文件内容,在文件中查询一个关键字,即搜索字符串的命令(在指定的文件中搜索符合条件的字符串)
  • 2、find :用于查找文件,适合找文件使用(linux 中最强大的搜索命令)
  • 3、locate : 是一个Linux系统的命令行工具,用于快速搜索文件系统中的文件。它使用一个数据库来存储文件的位置,以便更快地搜索文件。消耗资源小,比find -name 快很多,但是新创建的文件找不到,并且 tmp 临时目录下的文件也找不到,原因,是locate 查找的是 Linux的数据库 /var/lib/mlocate.db ,但是数据库每天自动更新一次,所有刚创建的文件找不到。


1、Linux中查找文件命令(超实用)

常用的 Linux 文件搜索命令有 find、locate 和 grep。其中,
find 命令可以根据文件名、文件类型、文件大小等条件进行搜索;
locate 命令可以快速定位文件,但需要先更新数据库;
grep 命令可以在文件中搜索指定的字符串。

1、grep : 查看文件内容,在文件中查询一个关键字,即搜索字符串的命令(在指定的文件中搜索符合条件的字符串)

grep 是包含匹配,不是完全的精确匹配,特别适合查找内容。
    
    1.1、语法 :
        grep [-option] 需要搜索的关键字 文件名

    1.2、参数:
    
        模式选择与解释:
          -E, --extended-regexp     <模式> 是扩展正则表达式
          -F, --fixed-strings       <模式> 是字符串
          -G, --basic-regexp        <模式> 是基本正则表达式
          -P, --perl-regexp         <模式> 是 Perl 正则表达式
          -e, --regexp=<模式>       用指定的<模式>字符串来进行匹配操作
          -f, --file=<文件>         从给定<文件>中取得<模式>
          -i, --ignore-case         在模式和数据中忽略大小写
              --no-ignore-case      不要忽略大小写(默认)
          -w, --word-regexp         强制<模式>仅完全匹配字词
          -x, --line-regexp         强制<模式>仅完全匹配整行
          -z, --null-data           数据行以一个 0 字节结束,而非换行符

        杂项:
          -s, --no-messages         不显示错误信息
          -v, --invert-match        选中不匹配的行
          -V, --version             显示版本信息并退出
              --help                显示此帮助并退出

        输出控制:
          -m, --max-count=<次数>    得到给定<次数>次匹配后停止
          -b, --byte-offset         输出的同时打印字节偏移
          -n, --line-number         输出的同时打印行号
              --line-buffered       每行输出后刷新输出缓冲区
          -H, --with-filename       为输出行打印文件名
          -h, --no-filename         输出时不显示文件名前缀
              --label=<标签>        将给定<标签>作为标准输入文件名前缀
          -o, --only-matching       只显示行中非空匹配部分
          -q, --quiet, --silent     不显示所有常规输出
              --binary-files=TYPE   设定二进制文件的 TYPE(类型);
                                    TYPE 可以是 'binary'、'text' 或 'without-match'
          -a, --text                等同于 --binary-files=text
          -I                        等同于 --binary-files=without-match
          -d, --directories=ACTION  读取目录的方式;
                                    ACTION 可以是`read', `recurse',或`skip'
          -D, --devices=ACTION      读取设备、先入先出队列、套接字的方式;
                                    ACTION 可以是`read'或`skip'
          -r, --recursive           等同于--directories=recurse
          -R, --dereference-recursive       同上,但遍历所有符号链接
              --include=GLOB        只查找匹配 GLOB(文件模式)的文件
              --exclude=GLOB        跳过匹配 GLOB 的文件
              --exclude-from=FILE   跳过所有匹配给定文件内容中任意模式的文件
              --exclude-dir=GLOB    跳过所有匹配 GLOB 的目录
          -L, --files-without-match  只打印没有匹配上的<文件>的名称
          -l, --files-with-matches  只打印有匹配的<文件>的名称
          -c, --count               只打印每个<文件>中的匹配行数目
          -T, --initial-tab         行首制表符对齐(如有必要)
          -Z, --null                在<文件>名最后打印空字符

        文件控制:
          -B, --before-context=NUM  打印文本及其前面NUM 行
          -A, --after-context=NUM   打印文本及其后面NUM 行
          -C, --context=NUM         打印NUM 行输出文本
          -NUM                      等同于 --context=NUM
              --color[=WHEN],
              --colour[=WHEN]       使用标记高亮匹配字串;
                                    WHEN 可以是“always”、“never”或“auto”
          -U, --binary              不要清除行尾的 CR 字符(MSDOS/Windows)


    1.3 示例:
        
        1、搜索文件中包含字符串"error"的行:

            grep "error" filename

        2、搜索文件中以"error"开头的行:
        
            grep "^error" filename
            
        3、搜索文件中以"error"结尾的行:
        
            grep "error$" filename
            
        4、搜索文件中包含单词"error"的行:
            
            grep -w "error" filename
        
        5、搜索文件中仅包含字符串"error"的行:
        
            grep "^error$" filename
             
        6、搜索文件中包含"error"或者"warning"的行:
            
            grep -e "error" -e "warning" filename   
        
        7、如果你需要在多个文件中查找,可以使用通配符:

            grep "search_string" *.txt

        8、如果你需要查找一个目录中的所有文件,可以使用 -r 选项:

            grep -r "search_string" /path/to/directory

        9、如果你需要查找一个目录中的所有文件,但是不需要显示匹配的行,可以使用 -l 选项:

            grep -rl "search_string" /path/to/directory

        10、如果你需要查找一个目录中的所有文件,但是需要忽略某些文件或目录,可以使用 --exclude 选项:

            grep -r --exclude-dir=dir_to_exclude "search_string" /path/to/directory

2、find :用于查找文件,适合找文件使用(linux 中最强大的搜索命令)

2.1、语法: find [path] [-option] ---- find [搜索范围][搜索条件]

    2.2、参数:
        -name:按照文件名进行匹配,支持通配符。
        -type:按照文件类型进行匹配,如f表示普通文件,d表示目录。
        -mtime:按照文件修改时间进行匹配,支持+-符号表示相对时间。
        -size:按照文件大小进行匹配,支持+-符号表示相对大小。    

    2.3、缺点:慢,原因就是会遍历磁盘内所有的文件名,所以在实际工作中,避免大范围内搜索,很耗资源。
        find 是在系统中搜索符合条件的文件名,是完全匹配,一模一样的名字,如果搜索过程中,需要匹配范围变大,使用通配符,并且用双引号括起来,让计算机更好的识别。

    2.4、常见的通配符: * ? []
        通配符 * ,将目录名字包含搜索条件的全部都列出来

        通配符 ?,表示将以搜索条件开头的目录都找出来

        通配符 [],结合 * 一起使用,表示查询文件以 [] 里面的内容结尾命名的文件信息

    2.5、按照文件的所有者进行搜索(了解)
    
        参数: -user 所有者 ---- 按照文件的所有者进行搜索(了解)
        
        [root@localhostTEST ~]# find / -user test01


    2.6、示例:
        1、搜索当前目录下所有文件名中包含 "test" 的文件:
            
            find . -name "test"
        
        2、搜索当前目录下所有文件名以 ".txt" 结尾的文件:
            
            find . -name "*.txt"
        
        3、搜索当前目录下所有文件名以 ".txt" 结尾且文件内容包含 "hello" 的文件:
            
            find . -name "*.txt" -exec grep -l "hello" {} ;
        
        4、搜索当前目录下所有文件名以 ".txt" 结尾且文件大小大于 1MB 的文件:
            
            find . -name "*.txt" -size +1M
        
        5、搜索当前目录下所有文件名以 ".txt" 结尾且修改时间在 7 天以内的文件:
            
            find . -name "*.txt" -mtime -7

        6、在"/usr/local"目录下查找所有普通文件:
            
            find /usr/local -type f

        7、过滤出一群文件夹中,含有某个特定文件夹的文件夹:
    
            方法 1:过滤出一群文件夹中,含有某个特定文件夹的文件夹:
                find /path/to/folder -type d -name "*target_folder*" -exec dirname {} \;

                /path/to/folder 是您要搜索文件夹的路径。
                *target_folder* 是您要查找的特定文件夹的名称。
                返回所有包含 target_folder 的文件夹的路径。
            
    
            方法 2:过滤出当前目录下所有含有名为 target 的子文件夹的文件夹,可以使用以下命令:
                find . -type d -regex '.*target.*'
    
                解释:
                . 表示从当前目录开始搜索。
                -type d 表示只搜索文件夹。
                -regex '.*target.*' 表示使用正则表达式匹配含有 target 的文件夹。
                    . 表示匹配任意字符,
                    * 表示匹配 0 或多个前面的字符。
                    .*target.* 表示匹配任意字符,后面跟着 target,再后面跟着任意字符。
                
                会输出所有含有名为 target 的子文件夹的文件夹的路径。

3、locate : 是一个Linux系统的命令行工具,用于快速搜索文件系统中的文件。它使用一个数据库来存储文件的位置,以便更快地搜索文件。消耗资源小,比find -name 快很多,但是新创建的文件找不到,并且 tmp 临时目录下的文件也找不到,原因,是locate 查找的是 Linux的数据库 /var/lib/mlocate.db ,但是数据库每天自动更新一次,所有刚创建的文件找不到。

3.1、语法 : locate 文件名
    

    3.2、参数: 
        -b:匹配搜索字符串的开头部分 
        -e:匹配搜索字符串的结尾部分 
        -i:忽略大小写 
        -l:列出所有匹配项 
        -n:仅显示文件名 
        -q:仅显示命中文件名
        
    3.3、示例:
        1、搜索新建文件"测试",数据库还没有更新,找不到:
        
            locate "测试"
        
        2、手动更新数据库:
            
            updatedb
        
        3、更新完数据库,再次查询,就找出来了    
            
            locate "测试"
        
        4、搜索可执行文件:
            
            locate -e
        
        5、搜索文件夹:
        
            locate -d
            
        6、搜索文件内容:
            
            locate -c
            
        7、搜索档案:
            
            locate -r
            
        8、搜索文件大小:
        
            locate -s