引言

在Linux中,有许多用于文件查找和管理的命令,其中最强大和最常用的一个是find命令。作为一个系统管理员或者普通用户,了解和掌握find命令的使用是非常重要的,它能帮助我们轻松地在文件系统中查找和处理文件。

find命令的功能强大且灵活,可以根据路径、文件名、大小、修改日期、权限等多种条件进行查找,还可以与其他命令(如grep、rm等)结合,执行复杂的任务。虽然find命令的参数选项很多,一开始可能看起来有点复杂,但是一旦掌握了基本用法和常见参数,就会发现它是一个非常有用的工具【7†source】。

但是需要注意的是,find命令在查找文件时可能会消耗较多的系统资源,特别是在对大量文件进行查找时。因此,在服务器负载较高时,我们应尽量避免在高峰期使用find命令。

在这篇文章中,我们将详细介绍find命令的语法格式、基本用法,以及参数选项分类。希望通过本文,可以帮助您更好地理解和使用find命令。

基本使用

语法格式

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

  1. find [参数] [路径] [查找和搜索范围]

例如,如果你想在某个特定的路径(如/)中查找名为”myDocument”的文件,你可以这样使用find命令:

  1. find / -name 'myDocument'

基本用法

在这个部分,我们将探讨find命令的一些基本用法。以下是一些示例

  • 在当前目录中查找所有文件:
    1. find .
  • 在/home目录中查找以.txt结尾的文件:
    1. find /home -name "*.txt"
  • 在当前目录和其子目录中查找所有以.txt和.pdf结尾的文件:
    1. find . \( -name "*.txt" -o -name "*.pdf" \)
  • 在/home目录中查找不以.txt结尾的文件:
    1. find /home ! -name "*.txt"
  • 在当前目录中,向下最大深度限制为3的查找:
    1. find . -maxdepth 3 -type f

参数选项分类

参数选项分类

  • 以下是以表格形式列出的find命令参数和选项: | 参数/选项 | 描述 | 示例 | | —- | —- | —- | | -name filename | 按名称搜索文件 | find / -name 'myDocument' | | -perm mode | 按权限搜索文件 | find / -perm 644 | | -user username | 按用户(属主)搜索文件 | find / -user john | | -group groupname | 按组(属组)搜索文件 | find / -group staff | | -mtime -n/+n | 按修改时间搜索文件 (-n
    表示在 n 天以内,+n
    表示在 n 天以前) | find / -mtime -7 | | -type [flcdbsp] | 按类型搜索文件 (f 普通文件, l 符号连接, d 目录, c 字符设备, b 块设备, s 套接字, p Fifo) | find / -type d | | -maxdepth levels
    -mindepth levels | 按目录深度搜索文件 | find / -maxdepth 3 -name 'myDocument' |

以上是一些常用的find命令参数和选项,对于更多的参数和选项,你可以参考 man find 或其他相关的文档

常用选项

实例

find命令排除某些目录或文件

在当前目录下排除abc目录,查找所有文件

  1. find . -path "./abc" -prune -o -print

在当前目录下排除abc目录,查找所有以.txt结尾的文件【方式一】

  1. find . -path "./abc" -prune -o -name "*.txt" -print

在当前目录下排除abc目录,查找所有以.txt结尾的文件【方式二】

  1. find . -name "*.txt" -not -path "./abc/*"

在当前目录下排除abc和def目录,查找所有以.txt结尾的文件

  1. find . \( -path ./abc -o -path ./def \) -prune -o -name "*.txt" -print

在当前目录下排除abc目录和def/h.txt文件,查找所有以.txt结尾的文件

  1. find . \( -path ./abc -o -path ./def/h.txt \) -prune -o -name "*.txt" -print

在当前目录下排除abc目录和def/h.txt文件和jk目录,查找所有以.txt结尾的文件

  1. find . \( -path ./abc -o -path ./def/h.txt -o -path ./jk \) -prune -o -name "*.txt" -print

在当前目录下查找所有不是以.html结尾的文件

  1. find . ! -name "*.html" -type f

根据文件或者正则表达式进行匹配

列出当前目录及子目录下所有文件和文件夹

  1. find .

在/home目录下查找以.txt结尾的文件名

  1. find /home -name "*.txt"

同上,但忽略大小写

  1. find /home -iname "*.txt"

当前目录及子目录下查找所有以.txt和.pdf结尾的文件

  1. find . \( -name "*.txt" -o -name "*.pdf" \) find . -name "*.txt" -o -name "*.pdf"

匹配文件路径或者文件

  1. find /usr/ -path "*local*"

基于正则表达式匹配文件路径

  1. find . -regex ".*\(\.txt\|\.pdf\)$"

同上,但忽略大小写

  1. find . -iregex ".*\(\.txt\|\.pdf\)$"

否定参数

找出/home下不是以.txt结尾的文件

  1. find /home ! -name "*.txt"

基于目录深度搜索

向下最大深度限制为3

  1. find . -maxdepth 3 -type f

搜索出深度距离当前目录至少2个子目录的所有文件

  1. find . -mindepth 2 -type f

根据文件时间戳进行搜索

find . -type f 时间戳
UNIX/Linux文件系统每个文件都有三种时间戳:

  • 访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
  • 修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
  • 变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。

搜索最近七天内被访问过的所有文件

  1. find . -type f -atime -7

搜索恰好在七天前被访问过的所有文件

  1. find . -type f -atime 7

搜索超过七天内被访问过的所有文件

  1. find . -type f -atime +7

搜索访问时间超过10分钟的所有文件

  1. find . -type f -amin +10

找出比file.log修改时间更长的所有文件

  1. find . -type f -newer file.log

根据文件大小进行匹配

  1. find . -type f -size 文件大小单元

文件大小单元:

  • b —— 块(512字节)
  • c —— 字节
  • w —— 字(2字节)
  • k —— 千字节
  • M —— 兆字节
  • G —— 吉字节

搜索大于10KB的文件

find . -type f -size +10k

搜索小于10KB的文件

find . -type f -size -10k

搜索等于10KB的文件

find . -type f -size 10k

示例

可以使用以下命令来查找Linux系统中大于 200MB 的文件,并按照系统盘排序,同时忽略外部挂载磁盘:

find / -mount -type f -size +200M -exec du -h {} + | sort -hr

这个命令将会在根目录(/)下寻找所有类型为文件 (-type f) 的文件,并且大小大于1GB (-size +1G),同时忽略外部挂载磁盘(-mount)。
然后,它将执行一个 du 命令来计算每个文件的大小,并按照人类可读的格式 (-h) 输出。这个输出将会被传递给 sort 命令,按照大小进行逆序排序 (-r),并使用人类可读的格式 (-h)。
由于这个命令需要搜索整个文件系统,可能会花费一些时间来完成操作。如果你知道你的目标文件存储在特定的目录中,可以替换 / 为该目录来缩小搜索范围,加快命令执行的速度。

删除匹配文件

删除当前目录下所有.txt文件

find . -type f -name "*.txt" -delete

根据文件权限/所有权进行匹配

当前目录下搜索出权限为 777 的文件

find . -type f -perm 777

找出当前目录下权限不是644的php文件

find . -type f -name "*.php" ! -perm 644

找出当前目录用户 tom 拥有的所有文件

find . -type f -user tom

找出当前目录用户组 sunk 拥有的所有文件

find . -type f -group sunk

借助-exec选项与其他命令结合使用

找出当前目录下所有root的文件,并把所有权更改为用户 tom

find .-type f -user root -exec chown tom {} \;

上例中,{} 用于与-exec选项结合使用来匹配所有文件,然后会被替换为相应的文件名。
找出自己家目录下所有的.txt文件并删除

find $HOME/. -name "*.txt" -ok rm {} \;

上例中,-ok和-exec行为一样,不过它会给出提示,是否执行相应的操作。
查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中

find . -type f -name "*.txt" -exec cat {} \;> all.txt

将30天前的.log文件移动到old目录中

find . -type f -mtime +30 -name "*.log" -exec cp {} old \;

找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来

find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;

因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令

-exec ./text.sh {} \;

搜索但跳出指定的目录

查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk

find . -path "./sk" -prune -o -name "*.txt" -print

find其他技巧收集

要列出所有长度为零的文件

find . -empty

使用 find 命令和正则表达式在 Linux 中查找文件

在 Linux 中,find 是一个非常强大的命令,用于在文件系统中查找文件。它可以根据各种条件进行搜索,包括文件名、文件类型、文件大小、文件的修改时间等。此外,find 命令还可以与正则表达式一起使用,以提供更复杂的搜索模式。

基本的 find 命令

在开始讨论如何使用正则表达式之前,让我们先回顾一下 find 命令的基本用法。以下是一个简单的例子:

find /path/to/directory -name "filename"

这个命令会在 /path/to/directory 目录及其所有子目录中查找名为 filename 的文件。

使用 -name 选项和通配符

-name 选项允许你使用通配符(也称为 globbing)来匹配文件名。例如,以下命令会找到所有以 .txt 结尾的文件:

find /path/to/directory -name "*.txt"

在这个例子中,* 是一个通配符,它匹配任何字符。

使用 -regex 选项和正则表达式

如果你需要更复杂的匹配模式,你可以使用 -regex 选项。这个选项允许你使用正则表达式来匹配整个文件路径。例如,以下命令会找到所有以 .txt 结尾的文件:

find /path/to/directory -regex ".*\.txt$"

在这个例子中,. 匹配任何字符,* 表示前面的字符可以重复任意次,\. 匹配点字符,txt 匹配文本 “txt”,$ 表示行的结束。

注意,-regex 选项匹配的是整个文件路径,而不仅仅是文件名。因此,你可能需要在你的正则表达式前后添加 .* 来确保匹配正确。

使用 -regextype 选项

find 命令默认使用 Emacs 风格的正则表达式。如果你想使用其他类型的正则表达式,你可以使用 -regextype 选项。例如,你可以使用 POSIX 风格的正则表达式,如下所示:

find /path/to/directory -regextype posix-extended -regex ".*\.txt$"

在这个例子中,-regextype posix-extended 表示使用 POSIX 扩展正则表达式。

注意,不是所有的系统都支持 -regextype 选项,这取决于你的 find 命令的具体实现。

结论

find 命令是一个非常强大的工具,可以帮助你在 Linux 文件系统中查找文件。通过结合

正则表达式类型

find 命令支持多种类型的正则表达式,你可以使用 -regextype 选项来选择你想使用的类型。以下是 find 命令支持的正则表达式类型:

  • findutils-default:这是 find 命令的默认正则表达式类型,几乎与 GNU Emacs 的正则表达式相同。唯一的区别是在 find 命令中,. 字符会匹配换行符。
  • emacs:这种类型的正则表达式与 GNU Emacs 的正则表达式相同。
  • gnu-awk:这种类型的正则表达式与 GNU awk 的正则表达式相同。
  • grep:这种类型的正则表达式与 grep 的正则表达式相同。
  • posix-awk:这种类型的正则表达式与 POSIX awk 的正则表达式相同。
  • awk:这种类型的正则表达式与 awk 的正则表达式相同。
  • posix-basic:这种类型的正则表达式与 POSIX 基本正则表达式相同。
  • posix-egrep:这种类型的正则表达式与 POSIX 扩展正则表达式相同。
  • egrep:这种类型的正则表达式与 egrep 的正则表达式相同。
  • posix-extended:这种类型的正则表达式与 POSIX 扩展正则表达式相同。

你可以根据你的需求选择适合你的正则表达式类型。例如,如果你熟悉 grep 的正则表达式,你可以使用 -regextype grep 选项。

结论

find 命令是一个非常强大的工具,可以帮助你在 Linux 文件系统中查找文件。通过结合正则表达式,你可以创建复杂的搜索模式,以找到你需要的文件。记住,你可以使用 -regextype 选项来选择你想使用的正则表达式类型。

find 中的 -print0

-print0find 命令的一个选项,用于将搜索结果打印出来,并使用 null 字符(\0)作为每个结果之间的分隔符。这在搜索结果可能包含在 shell 中有特殊含义的字符(例如空格或换行符)时非常有用,因为 null 字符不会被 shell 解释,可以安全地用于分隔结果。
例如,下面的命令将在当前目录及其子目录中搜索所有文件,并使用 null 字符分隔打印出找到的文件的名称:

find . -type f -print0

这对于可以接受 null 分隔输入的程序(例如 xargs -0)非常有用。
以下是 find 命令的完整用法:

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

path 指定要搜索文件的目录。如果没有指定路径,则使用当前目录。
expression 是一系列选项和测试,用于指定选择文件的标准。-print0 选项只是 find 命令中的许多选项之一。其他常用选项包括 -name(匹配文件名)、-size(匹配文件大小)和 -type(匹配文件类型,例如 f 表示文件,d 表示目录)。
有关 `

参考实例

使用 -name 参数查看/etc目录下面所有的 .conf 结尾的配置文件:

[root@lwmacct ~]# find /etc -name "*.conf

使用-size参数查看/etc目录下面大于1M的文件:

[root@lwmacct ~]# find /etc -size +1M

查找当前用户主目录下的所有文件:

[root@lwmacct ~]# find $HOME -print

列出当前目录及子目录下所有文件和文件夹:

[root@lwmacct ~]# find .

在/home目录下查找以.txt结尾的文件名:

[root@lwmacct ~]# find /home -name "*.txt"

在/var/log目录下忽略大小写查找以.log结尾的文件名:

[root@lwmacct ~]# find /var/log -iname "*.log"

搜索超过七天内被访问过的所有文件:

[root@lwmacct ~]# find . -type f -atime +7

搜索访问时间超过10分钟的所有文件:

[root@lwmacct ~]# find . -type f -amin +10

找出/home下不是以.txt结尾的文件:

[root@lwmacct ~]# find /home ! -name "*.txt"

推荐阅读