• 15 个实用的 Linux find 命令示例


    除了在目录结构下查找文件的基本操作外,我们还可以使用 find 命令执行一些实际操作,这将使我们的命令行之旅变得轻松。

    在本文中,让我们回顾 15 个 Linux find 命令的实际示例,它们对新手和专家都非常有用。

    首先,在主目录下创建以下示例空文件,从而方便尝试下面提到的一些 find 命令示例。

    $ vim create_sample_files.sh
    touch MybashProgram.sh
    touch mycprogram.c
    touch MyCProgram.c
    touch Program.c
    
    mkdir backup
    cd backup
    
    touch MybashProgram.sh
    touch mycprogram.c
    touch MyCProgram.c
    touch Program.c
    
    $ chmod +x create_sample_files.sh
    
    $ ./create_sample_files.sh
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    查看运行结果如下

    shell脚本创建文件

    1.使用名称查找文件

    这是 find 命令的基本用法。 此示例在当前目录及其所有子目录中查找名称为 MyCProgram.c 的所有文件。

    $ find -name "MyCProgram.c"
    
    • 1

    find 使用名称查找文件

    2.使用名称查找文件并忽略大小写

    这是 find 命令的基本用法。 此示例在当前目录及其所有子目录中查找名称为 MyCProgram.c(忽略大小写)的所有文件。

    $ find -iname "MyCProgram.c"
    
    • 1

    find 使用名称查找文件并忽略大小写

    3.使用 mindepth 和 maxdepth 将搜索限制在特定目录级别

    在从根目录开始的所有子目录下找到 passwd 文件。

    $ find / -name passwd
    
    • 1

    find 命令查找 passwd文件

    在根目录下找到 passwd 文件并向下一层。 (即根目录 - 1 级,一个子目录 - 2 级)

    $ find / -maxdepth 2 -name passwd
    
    • 1

    find 指定目录深度级别查找passwd

    找到root下两级下的 passwd 文件。 (即 root — 级别 1,以及两个子目录 — 级别 2 和 3 )

    $ find / -maxdepth 3 -name passwd
    
    • 1

    find 指定目录深度级别查找passwd

    找到子目录级别 2 和 4 之间的 passwd 文件。

    $ find / -mindepth 3 -maxdepth 5 -name passwd
    
    • 1

    find 找到子目录级别2和4之间的passwd

    4.对Find命令找到的文件执行命令

    在下面的示例中,find 命令计算所有名称为 MyCProgram.c 的文件的 md5sum(忽略大小写)。 {} 替换为当前文件名。

    $ find -iname "MyCProgram.c" -exec md5sum {} \;
    
    • 1

    对Find命令找到的文件执行命令

    5.逆转查找结果

    显示名称不是 MyCProgram.c 的文件或目录。由于 maxdepth 为 1,因此只会在当前目录下查看。

    $ find -maxdepth 1 -not -iname "MyCProgram.c"
    
    • 1

    find 逆转查找结果

    6.通过 inode Number 查找文件。

    每个文件都有一个唯一的 inode 编号,使用它我们可以识别该文件。 创建两个具有相似名称的文件。 即一个文件末尾有一个空格。

    $ touch "test-file-name"
    
    $ touch "test-file-name " # 注意这后面的空格
    [Note: There is a space at the end]
    
    $ ls -1 test*
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    查看文件的结果如下

    find 命令示例显示文件

    从 ls 输出中,我们无法确定哪个文件末尾有空格。 使用选项 -i 可以查看文件的 inode 号,这两个文件会有所不同。

    $ ls -i1 test*
    
    • 1

    ls 查看文件inode 编号

    我们可以在 find 命令上指定 inode 编号,如下所示。 在此示例中,find 命令使用 inode 编号重命名文件。

    $ find -inum 37945133 -exec mv {} new-test-file-name \;
    
    $ ls -i1 *test*
    
    • 1
    • 2
    • 3

    find 通过 inode 编号查找文件

    当我们想对命名不佳的文件进行一些操作时,我们可以使用此方式,如下例所示。 例如,名称为 - file?.txt 的文件中包含一个特殊字符。 如果我们尝试执行 rm file?.txt,以下三个文件都将被删除。 因此,请按照以下步骤仅删除“file?.txt”文件。

    $ ls
    file1.txt  file2.txt  file?.txt
    
    • 1
    • 2

    查找每个文件的 inode 号。

    $ ls -i1
    
    • 1

    ls 查看文件inode编号

    使用 inode 编号删除其中包含特殊字符的文件,如下所示。

    $ find -inum 37945122 -exec rm {} \;
    
    • 1

    find 命令按照inode编号查找删除文件

    7.根据文件权限查找文件

    可以进行以下操作。

    • 查找与确切权限匹配的文件
    • 检查给定的权限是否匹配,而不考虑其他权限位
    • 通过给出八进制/符号表示进行搜索

    对于此示例,让我们假设该目录包含以下文件。 请注意,这些文件的文件权限是不同的。

    $ ls -l
    
    • 1

    ls 命令查看文件权限

    查找对组具有执行(x)权限的文件。 使用以下命令在我们的主目录中查找可执行的所有文件,而不管该文件的其他权限。

    $ find . -perm -g=x -type f -exec ls -l {} \;
    
    • 1

    find 查找具有可执行权限的文件

    查找仅对组具有读取权限的文件。

    $ find . -perm g=r -type f -exec ls -l {} \;
    
    • 1

    查找仅对组具有读取权限的文件 [按八进制搜索]

    $ find . -perm 040 -type f -exec ls -l {} \;
    
    • 1

    8.在你的主目录及其子目录中查找所有空文件(零字节文件)

    以下命令输出的大多数文件将是其他应用程序创建的锁定文件和占位符。

    $ find ~ -empty
    
    • 1

    仅列出我们的主目录中的所有空文件。

    $ find . -maxdepth 1 -empty
    
    • 1

    仅列出当前目录中的非隐藏空文件。

    $ find . -maxdepth 1 -empty -not -name ".*"
    
    • 1

    9.查找前 5 个大文件

    以下命令将显示当前目录及其子目录中前 5 个最大的文件。 这可能需要一段时间才能执行,具体取决于命令必须处理的文件总数。

    $ find . -type f -exec ls -s {} \; | sort -n -r | head -5
    
    • 1

    find 查找前 5 个大文件

    10.查找前 5 个小文件

    方法与查找更大的文件相同,但排序的唯一区别是升序。

    $ find . -type f -exec ls -s {} \; | sort -n  | head -5
    
    • 1

    find 查找前 5 个小文件

    在上面的命令中,很可能我们只会看到零字节文件(空文件)。 因此,我们可以使用以下命令列出除零字节文件之外的较小文件。

    $ find . -not -empty -type f -exec ls -s {} \; | sort -n  | head -5
    
    • 1

    11.使用选项 -type 根据文件类型查找文件

    仅查找套接字文件。

    $ find . -type s
    
    • 1

    查找所有目录

    $ find . -type d
    
    • 1

    只查找普通文件

    $ find . -type f
    
    • 1

    找到所有隐藏文件

    $ find . -type f -name ".*"
    
    • 1

    找到所有隐藏目录

    $ find -type d -name ".*"
    
    • 1

    12.通过比较其他文件的修改时间来查找文件

    显示在指定文件之后修改的文件。 以下 find 命令显示了在 test-file-name 之后创建/修改的所有文件。

    $ find -newer test-file-name
    
    • 1

    find 通过比较其他文件的修改时间来查找文件

    13.按大小查找文件

    使用 -size 选项,我们可以按大小查找文件。

    查找大于给定大小的文件

    $ find ~ -size +100M
    
    • 1

    查找小于给定大小的文件

    $ find ~ -size -100M
    
    • 1

    查找与给定大小完全匹配的文件

    $ find ~ -size 100M
    
    • 1

    !> 注意 :- 表示小于给定大小,+ 表示大于给定大小,无符号表示精确给定大小。

    14.为频繁的查找操作创建别名

    如果发现某些查找操作非常有用,那么我们可以将其设为别名。 并随时执行它。

    经常删除名为 a.out 的文件。

    $ alias rmao="find . -iname a.out -exec rm {} \;"
    $ rmao
    
    • 1
    • 2

    删除 c 程序生成的核心文件。

    $ alias rmc="find . -iname core -exec rm {} \;"
    $ rmc
    
    • 1
    • 2

    15.使用 find 命令删除大存档文件

    以下命令删除超过 100M 的 *.zip 文件。

    $ find / -type f -name *.zip -size +100M -exec rm -i {} \;"
    
    • 1

    使用别名 rm100m 删除所有超过 100M 的 *.tar 文件(删除 100M)。 使用类似的概念并创建别名,如 rm1grm2grm5g 以分别删除大于 1G2G5G 的文件大小。

    $ alias rm100m="find / -type f -name *.tar -size +100M -exec rm -i {} \;"
    $ alias rm1g="find / -type f -name *.tar -size +1G -exec rm -i {} \;"
    $ alias rm2g="find / -type f -name *.tar -size +2G -exec rm -i {} \;"
    $ alias rm5g="find / -type f -name *.tar -size +5G -exec rm -i {} \;"
    
    $ rm100m
    $ rm1g
    $ rm2g
    $ rm5g
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    javascript函数式编程初探——什么是函数式编程?
    Linux下gdb常规调试
    知物由学 | 弹幕蜂拥而入,智能审核平台如何用技术破局?
    Python之requests实现github模拟登录
    基于改进灰狼算法优化核极限学习机的锂电池动力电池荷电状态估计
    Promise的基本用法,基于Promise处理ajax请求
    中级职称有什么作用和好处?为什么要办一个职称?
    C语言题收录(八)
    解决passwd:Authentication token manipulation error
    Go实现MapReduce
  • 原文地址:https://blog.csdn.net/fengqianlang/article/details/127340657