妈妈,我找到了!— 15 个实用的 Linux Find 命令实例 (第 1 部分)

举报
Tiamo_T 发表于 2021/08/24 14:53:27 2021/08/24
【摘要】 除了在目录结构下查找文件的基本操作外,您还可以使用 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
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。