【摘要】 除了在目录结构下查找文件的基本操作外,您还可以使用 find 命令执行一些实际操作,这将使您的命令行之旅变得轻松。在本文中,让我们回顾 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
  • # ls -R
  • .:
  • backup                  MybashProgram.sh  MyCProgram.c
  • create_sample_files.sh  mycprogram.c      Program.c
  • ./backup:
  • MybashProgram.sh  mycprogram.c  MyCProgram.c  Program.c
  • 复制代码
    1. 使用名称查找文件

    这是 find 命令的基本用法。本示例在当前目录及其所有子目录中查找名称为 MyCProgram.c 的所有文件。
    # find -name "MyCProgram.c"
  • ./backup/MyCProgram.c
  • ./MyCProgram.c
  • 复制代码

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

    这是 find 命令的基本用法。本示例在当前目录及其所有子目录中查找名称为 MyCProgram.c(忽略大小写)的所有文件。
    # find -iname "MyCProgram.c"
  • ./mycprogram.c
  • ./backup/mycprogram.c
  • ./backup/MyCProgram.c
  • ./MyCProgram.c
  • 复制代码
    3. 使用 mindepth 和 maxdepth 将搜索限制到特定目录级别

    在从根目录开始的所有子目录下找到passwd文件。
    # find / -name passwd
  • ./usr/share/doc/nss_ldap-253/pam.d/passwd
  • ./usr/bin/passwd
  • ./etc/pam.d/passwd
  • ./etc/passwd
  • 复制代码
    在 root 下找到下一级的 passwd 文件。(即 root — 级别 1,以及一个子目录 — 级别 2)
    # find -maxdepth 2 -name passwd
  • ./etc/passwd
  • 复制代码
    找到root下两级下的passwd文件。(即 root — 级别 1,以及两个子目录 — 级别 2 和 3 )
    # find / -maxdepth 3 -name passwd
  • ./usr/bin/passwd
  • ./etc/pam.d/passwd
  • ./etc/passwd
  • 复制代码
    在子目录级别 2 和 4 之间找到密码文件。
    # find -mindepth 3 -maxdepth 5 -name passwd
  • ./usr/bin/passwd
  • ./etc/pam.d/passwd
  • 复制代码
    4. 对 Find 命令找到的文件执行命令。

    在下面的示例中,find 命令计算所有名为 MyCProgram.c 的文件的 md5sum(忽略大小写)。{} 替换为当前文件名。
    # find -iname "MyCProgram.c" -exec md5sum {} \;
  • d41d8cd98f00b204e9800998ecf8427e ./mycprogram.c
  • d41d8cd98f00b204e9800998ecf8427e ./backup/mycprogram.c
  • d41d8cd98f00b204e9800998ecf8427e ./backup/MyCProgram.c
  • d41d8cd98f00b204e9800998ecf8427e ./MyCProgram.c
  • 复制代码
    5. 反转比赛。

    显示名称不是 MyCProgram.c 的文件或目录。由于 maxdepth 为 1,这将仅在当前目录下查看。
    # find -maxdepth 1 -not -iname "MyCProgram.c"
  • .
  • ./MybashProgram.sh
  • ./create_sample_files.sh
  • ./backup
  • ./Program.c
  • 复制代码
    6. 按 inode 编号查找文件。

    每个文件都有一个唯一的 inode 编号,我们可以使用它来识别该文件。创建两个名称相似的文件。即一个文件末尾有一个空格。
    # touch "test-file-name"
  • # touch "test-file-name "
  • [Note: There is a space at the end]
  • # ls -1 test*
  • test-file-name
  • test-file-name
  • 复制代码
    从 ls 输出中,您无法确定哪个文件末尾有空格。使用选项 -i 可以查看文件的 inode 编号,这两个文件的 inode 编号会有所不同。
    # ls -i1 test*
  • 16187429 test-file-name
  • 16187430 test-file-name
  • 复制代码
    您可以在 find 命令上指定 inode 编号,如下所示。在此示例中, find 命令使用 inode 编号重命名文件。
    # find -inum 16187430 -exec mv {} new-test-file-name \;
  • # ls -i1 *test*
  • 16187430 new-test-file-name
  • 16187429 test-file-name
  • 复制代码
    当您想对命名不当的文件进行一些操作时,可以使用此技术,如下例所示。例如,名称为 file?.txt 的文件中有一个特殊字符。如果您尝试执行“rm file?.txt”,以下三个文件都将被删除。因此,请按照以下步骤仅删除“file?.txt”文件。
    # ls
  • file1.txt  file2.txt  file?.txt
  • 复制代码
    查找每个文件的 inode 编号。
    # ls -i1
  • 804178 file1.txt
  • 804179 file2.txt
  • 804180 file?.txt
  • 复制代码
    使用 inode 编号删除包含特殊字符的文件,如下所示。
    # find -inum 804180 -exec rm {} \;
  • # ls
  • file1.txt  file2.txt
  • [Note: The file with name "file?.txt" is now removed]
  • 复制代码
    7.根据文件权限查找文件

    可以进行以下操作。

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

    对于此示例,让我们假设该目录包含以下文件。请注意,这些文件的文件权限是不同的。
    # ls -l
  • total 0
  • -rwxrwxrwx 1 root root 0 2019-02-19 20:31 all_for_all
  • -rw-r--r-- 1 root root 0 2019-02-19 20:30 everybody_read
  • ---------- 1 root root 0 2019-02-19 20:31 no_for_all
  • -rw------- 1 root root 0 2019-02-19 20:29 ordinary_file
  • -rw-r----- 1 root root 0 2019-02-19 20:27 others_can_also_read
  • ----r----- 1 root root 0 2019-02-19 20:27 others_can_only_read
  • 复制代码
    查找对组具有读取权限的文件。使用以下命令在您的主目录中查找世界可读的所有文件,而不管该文件的其他权限如何。
    # find . -perm -g=r -type f -exec ls -l {} \;
  • -rw-r--r-- 1 root root 0 2019-02-19 20:30 ./everybody_read
  • -rwxrwxrwx 1 root root 0 2019-02-19 20:31 ./all_for_all
  • ----r----- 1 root root 0 2019-02-19 20:27 ./others_can_only_read
  • -rw-r----- 1 root root 0 2019-02-19 20:27 ./others_can_also_read
  • 复制代码
    查找仅对组具有读取权限的文件。
    # find . -perm g=r -type f -exec ls -l {} \;
  • ----r----- 1 root root 0 2019-02-19 20:27 ./others_can_only_read
  • 复制代码
    查找仅具有读取权限的文件以分组 [按八进制搜索]
    # find . -perm 040 -type f -exec ls -l {} \;
  • ----r----- 1 root root 0 2019-02-19 20:27 ./others_can_only_read
  • 复制代码
    8.在你的主目录及其子目录中查找所有空文件(零字节文件)

    以下命令输出的大多数文件将是其他应用程序创建的锁定文件和占位符。
    # find ~ -empty
    复制代码
    仅列出主目录中的所有空文件。
    # find . -maxdepth 1 -empty
    复制代码
    仅列出当前目录中非隐藏的空文件。
    # find . -maxdepth 1 -empty -not -name ".*"
    复制代码
    9. 查找前 5 个大文件

    以下命令将显示当前目录及其子目录中前 5 个最大的文件。这可能需要一段时间才能执行,具体取决于命令必须处理的文件总数。
    # find . -type f -exec ls -s {} \; | sort -n -r | head -5
    复制代码
    10. 查找前 5 个小文件

    技术与查找更大的文件相同,但排序的唯一区别是升序。
    # find . -type f -exec ls -s {} \; | sort -n  | head -5
    复制代码
    在上面的命令中,您很可能只会看到零字节文件(空文件)。因此,您可以使用以下命令列出除零字节文件之外的较小文件。
    # find . -not -empty -type f -exec ls -s {} \; | sort -n  | head -5
  • 复制代码
    11. 使用选项 -type 根据文件类型查找文件

    仅查找套接字文件。
    # find . -type s
    复制代码
    查找所有目录
    # find . -type d
    复制代码
    只查找普通文件
    # find . -type f
    复制代码
    找到所有隐藏文件
    # find . -type f -name ".*"
    复制代码
    找到所有隐藏目录
    # find -type d -name ".*"
    复制代码
    12.通过与其他文件的修改时间进行比较来查找文件。

    显示在指定文件之后修改的文件。下面的 find 命令显示了在普通文件之后创建/修改的所有文件。
    # ls -lrt
  • total 0
  • -rw-r----- 1 root root 0 2019-02-19 20:27 others_can_also_read
  • ----r----- 1 root root 0 2019-02-19 20:27 others_can_only_read
  • -rw------- 1 root root 0 2019-02-19 20:29 ordinary_file
  • -rw-r--r-- 1 root root 0 2019-02-19 20:30 everybody_read
  • -rwxrwxrwx 1 root root 0 2019-02-19 20:31 all_for_all
  • ---------- 1 root root 0 2019-02-19 20:31 no_for_all
  • # find -newer ordinary_file
  • .
  • ./everybody_read
  • ./all_for_all
  • ./no_for_all
  • 复制代码
    13. 按大小查找文件

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

    查找大于给定大小的文件
    # find ~ -size +100M
    复制代码
    查找小于给定大小的文件
    # find ~ -size -100M
    复制代码
    查找与给定大小完全匹配的文件
    # find ~ -size 100M
    复制代码
    注:– 表示小于给定尺寸,+ 表示大于给定尺寸,无符号表示精确给定尺寸。

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

    如果您发现某些东西非常有用,那么您可以将其设为别名。并随时执行它。

    经常删除名为 a.out 的文件。
    # alias rmao="find .-iname a.out -exec rm {} \;"
  • #rmao
  • 复制代码
    删除c程序生成的核心文件。
    # alias rmc="find .-iname core -exec rm {} \;"
  • #rmc
  • 复制代码
    15.使用find命令删除大存档文件

    以下命令删除超过 100M 的 *.zip 文件。
    # find / -type f -name *.zip -size +100M -exec rm -i {} \;"
    复制代码
    使用别名 rm100m(删除 100M)删除所有超过 100M 的 *.tar 文件。使用类似的概念并创建别名,如 rm1g、rm2g、rm5g 以分别删除大于 1G、2G 和 5G 的文件大小。
    # 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
  • 复制代码
    来源:华为云社区 https://bbs.huaweicloud.com/blogs/297052 作者:Tiamo_T
    【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和华为云社区有权追究责任。