除了在目录结构下查找文件的基本操作外,您还可以使用 find 命令执行一些实际操作,这将使您的命令行之旅变得轻松。
在本文中,让我们回顾 15 个对新手和专家都非常有用的 Linux find 命令的实际实例。
首先,在您的主目录下创建以下示例空文件,以尝试下面提到的一些 find 命令实例。
在本文中,让我们回顾 15 个对新手和专家都非常有用的 Linux find 命令的实际实例。
首先,在您的主目录下创建以下示例空文件,以尝试下面提到的一些 find 命令实例。
# vim create_sample_files.shtouch 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
复制代码这是 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
复制代码在从根目录开始的所有子目录下找到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
复制代码# find -mindepth 3 -maxdepth 5 -name passwd./usr/bin/passwd ./etc/pam.d/passwd
复制代码在下面的示例中,find 命令计算所有名为 MyCProgram.c 的文件的 md5sum(忽略大小写)。{} 替换为当前文件名。
# find -iname "MyCProgram.c" -exec md5sum {} \;d41d8cd98f00b204e9800998ecf8427e ./mycprogram.c d41d8cd98f00b204e9800998ecf8427e ./backup/mycprogram.c d41d8cd98f00b204e9800998ecf8427e ./backup/MyCProgram.c d41d8cd98f00b204e9800998ecf8427e ./MyCProgram.c
复制代码显示名称不是 MyCProgram.c 的文件或目录。由于 maxdepth 为 1,这将仅在当前目录下查看。
# find -maxdepth 1 -not -iname "MyCProgram.c". ./MybashProgram.sh ./create_sample_files.sh ./backup ./Program.c
复制代码每个文件都有一个唯一的 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”文件。
# lsfile1.txt file2.txt file?.txt
复制代码查找每个文件的 inode 编号。
# ls -i1804178 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]
复制代码可以进行以下操作。
- 查找与权限完全匹配的文件
- 检查给定的权限是否匹配,而不考虑其他权限位
- 通过给出八进制/符号表示进行搜索
对于此示例,让我们假设该目录包含以下文件。请注意,这些文件的文件权限是不同的。
# ls -ltotal 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
复制代码以下命令输出的大多数文件将是其他应用程序创建的锁定文件和占位符。
# find ~ -empty
复制代码仅列出主目录中的所有空文件。
# find . -maxdepth 1 -empty
复制代码仅列出当前目录中非隐藏的空文件。
# find . -maxdepth 1 -empty -not -name ".*"
复制代码以下命令将显示当前目录及其子目录中前 5 个最大的文件。这可能需要一段时间才能执行,具体取决于命令必须处理的文件总数。
# find . -type f -exec ls -s {} \; | sort -n -r | head -5
复制代码技术与查找更大的文件相同,但排序的唯一区别是升序。
# find . -type f -exec ls -s {} \; | sort -n | head -5
复制代码在上面的命令中,您很可能只会看到零字节文件(空文件)。因此,您可以使用以下命令列出除零字节文件之外的较小文件。
# find . -not -empty -type f -exec ls -s {} \; | sort -n | head -5
复制代码仅查找套接字文件。
# find . -type s
复制代码查找所有目录
# find . -type d
复制代码只查找普通文件
# find . -type f
复制代码找到所有隐藏文件
# find . -type f -name ".*"
复制代码找到所有隐藏目录
# find -type d -name ".*"
复制代码显示在指定文件之后修改的文件。下面的 find 命令显示了在普通文件之后创建/修改的所有文件。
# ls -lrttotal 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
复制代码使用 -size 选项可以按大小查找文件。
查找大于给定大小的文件
查找大于给定大小的文件
# find ~ -size +100M
复制代码查找小于给定大小的文件
# find ~ -size -100M
复制代码查找与给定大小完全匹配的文件
# find ~ -size 100M
复制代码注:– 表示小于给定尺寸,+ 表示大于给定尺寸,无符号表示精确给定尺寸。
如果您发现某些东西非常有用,那么您可以将其设为别名。并随时执行它。
经常删除名为 a.out 的文件。
# alias rmao="find .-iname a.out -exec rm {} \;"#rmao
复制代码删除c程序生成的核心文件。
# alias rmc="find .-iname core -exec rm {} \;"#rmc
复制代码以下命令删除超过 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
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和华为云社区有权追究责任。