• linux命令之查找find整理、逻辑操作


    linux命令之查找find整理及逻辑操作

    find 是 Linux 系统中用于在目录树中查找文件或目录。它可以根据文件名、文件类型、大小、访问和修改时间等多种条件来查找文件。下面我将详细介绍 -name、-type、-size、maxdepth、-exec、-okxargs 这些参数。

    一、 find 命令的基本语法格式如下:

    bash

    find [路径] [表达式]
    find [路径] [-参数1 实参1 -参数2 实参2]
    
    • 1
    • 2

    其中:

    [路径]:指定 find 命令开始搜索的目录路径。如果省略,默认为当前目录(.)。
    [表达式]:由选项(如 -name, -type, -size 等)和参数构成的搜索条件。多个表达式可以通过逻辑操作符(如 -and, -or, -not 或简写形式 !, -a, -o)组合起来。

    1. -name

    -name 参数允许你根据文件名来查找文件。你可以使用通配符 * 来匹配任意字符序列,? 来匹配任意单个字符。

    示例:查找当前目录及其子目录中所有以 .txt 结尾的文件:

    bash

    find . -name "*.txt"
    
    • 1

    2. -type

    -type 参数允许你根据文件类型来查找文件。常见的文件类型包括:

    f:普通文件
    d:目录
    l:符号链接
    b:块设备文件
    c:字符设备文件
    p:管道文件
    s:套接字文件
    示例:查找当前目录及其子目录中所有的目录:

    bash

    find . -type d
    
    • 1

    3. -size

    -size 参数允许你根据文件大小来查找文件。大小可以以字节、千字节、兆字节等为单位指定。

    示例:查找当前目录及其子目录中所有大于 1M 的文件:

    bash

    find . -size +1M
    
    • 1

    注意:+ 表示大于,- 表示小于,如果不加符号则表示等于。

    4. maxdepth

    maxdepth 参数限制 find 命令搜索的目录深度。这可以显著提高查找效率,特别是在大型文件系统中。

    示例:在当前目录及其直接子目录中查找所有的 .txt 文件(不搜索孙子目录等):

    bash

    find . -maxdepth 1 -name "*.txt"
    
    • 1

    5. -exec

    -exec 参数允许你对找到的每个文件再执行指定的 shell 命令。命令需要以 ; 结尾,并且在某些系统中,为了安全起见,你可能需要在 ; 的前面加上 {} \ 来转义。

    示例:查找当前目录及其子目录中所有的 .txt 文件,并删掉它们:

    bash

    find . -name "*.txt" -exec rm {} \;
    
    • 1

    这里的 {} 是一个占位符,代表 find 命令找到的每个文件。

    6. -ok

    -ok 参数与 -exec 类似,但在执行命令之前,它会为每个文件询问用户的确认。这可以防止因误操作而删或修改重要文件。

    示例:查找当前目录及其子目录中所有的 .txt 文件,并在删除前询问确认:

    bash

    find . -name "*.txt" -ok rm {} \;
    
    • 1

    7. xargs

    xargs 不是一个 find 命令的参数,而是一个独立的命令行工具,经常与 find 命令结合使用。find 命令的输出可以传递给 xargs,然后 xargs 会将输出作为参数传递给另一个命令。这在处理大量文件时特别有用,因为它可以避免命令行参数过长的问题。

    示例:查找当前目录及其子目录中所有的 .txt 文件,并使用 cat 命令将它们的内容合并到一个文件中:

    bash

    find . -name "*.txt" -print0 | xargs -0 cat > merged.txt
    
    • 1

    这里 -print0 和 -0 是为了处理文件名中的特殊字符(如空格、换行等)。

    二、逻辑连接

    多个表达式可以通过逻辑操作符组合起来,意味着你可以使用逻辑操作符来连接不同的 find 命令选项和条件,从而构建出更复杂的搜索表达式。这些逻辑操作符允许你指定文件或目录必须满足(-and 或 -a)、只需满足(-or 或 -o)或不满足(-not 或 !)某一组条件。

    这里有一些示例来帮助理解这个概念:

    1、使用 -and 或 -a(逻辑与)(不添加操作符默认为and

    查找当前目录及其子目录中所有以 .txt 结尾且修改时间在最近7天内的文件:

    bash

    find . -name "*.txt" -and -mtime -7  
    
    • 1

    也可为:

    find . -name "*.txt" -a -mtime -7
    
    • 1

    因为默认就是与操作,可直接排列表达式,也可简写为

    find . -name "*.txt" -a -mtime -7
    
    • 1

    在这个例子中,文件必须同时满足 -name “*.txt” 和 -mtime -7 这两个条件。

    2、使用 -or 或 -o(逻辑或)

    查找当前目录及其子目录中所有以 .txt 结尾或者以 .log 结尾的文件:

    bash

    find . -name "*.txt" -or -name "*.log"  
    
    • 1

    或者简写为

    find . -name "*.txt" -o -name "*.log"
    
    • 1

    在这个例子中,文件只需满足其中一个 -name 条件即可。

    3、使用 -not 或 !(逻辑非)

    查找当前目录及其子目录中所有不是目录的文件:

    find . ! -type d  
    
    • 1

    或者使用 -not

    find . -not -type d
    
    • 1

    在这个例子中,find 命令会排除所有类型为目录的文件。

    你也可以再组合这些逻辑操作符来构建更复杂的表达式。例如,查找当前目录及其子目录中所有以 .txt 结尾但不是目录的文件,并且这些文件的修改时间在最近7天内:

    bash

    find . -name "*.txt" -and ! -type d -and -mtime -7  
    
    • 1

    或者简写为

    find . -name "*.txt" -a ! -type d -a -mtime -7
    
    • 1

    在这个复杂的例子中,文件必须同时满足三个条件:文件名以 .txt 结尾、不是目录、且修改时间在最近7天内。

    通过组合这些逻辑操作符,你可以创建出几乎任何你需要的复杂搜索条件。

    总结

  • 相关阅读:
    #define 的神奇操作
    Python新特性
    免费代理IP VS 付费代理IP,为何选择后者更明智?
    Sentinel使用Nacos存储规则
    了解zabbix
    听GPT 讲Rust源代码--src/librustdoc
    智慧工地管理系统(Smart site management system)源码
    JSP 教学文档管理系统myeclipse开发mysql数据库bs框架java编程jdbc详细设计
    Deque继承ArrayDeque和继承LinkedList区别在哪里
    数据屏蔽:静态与动态
  • 原文地址:https://blog.csdn.net/ULTRAmanTAROACE/article/details/138195579