引言
在Linux中,有许多用于文件查找和管理的命令,其中最强大和最常用的一个是find
命令。作为一个系统管理员或者普通用户,了解和掌握find
命令的使用是非常重要的,它能帮助我们轻松地在文件系统中查找和处理文件。
find
命令的功能强大且灵活,可以根据路径、文件名、大小、修改日期、权限等多种条件进行查找,还可以与其他命令(如grep、rm等)结合,执行复杂的任务。虽然find
命令的参数选项很多,一开始可能看起来有点复杂,但是一旦掌握了基本用法和常见参数,就会发现它是一个非常有用的工具【7†source】。
但是需要注意的是,find
命令在查找文件时可能会消耗较多的系统资源,特别是在对大量文件进行查找时。因此,在服务器负载较高时,我们应尽量避免在高峰期使用find
命令。
在这篇文章中,我们将详细介绍find
命令的语法格式、基本用法,以及参数选项分类。希望通过本文,可以帮助您更好地理解和使用find
命令。
基本使用
语法格式
find
命令的基本语法格式如下:
find [参数] [路径] [查找和搜索范围]
例如,如果你想在某个特定的路径(如/)中查找名为”myDocument”的文件,你可以这样使用find
命令:
find / -name 'myDocument'
基本用法
在这个部分,我们将探讨find
命令的一些基本用法。以下是一些示例
- 在当前目录中查找所有文件:
find .
- 在/home目录中查找以.txt结尾的文件:
find /home -name "*.txt"
- 在当前目录和其子目录中查找所有以.txt和.pdf结尾的文件:
find . \( -name "*.txt" -o -name "*.pdf" \)
- 在/home目录中查找不以.txt结尾的文件:
find /home ! -name "*.txt"
- 在当前目录中,向下最大深度限制为3的查找:
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目录,查找所有文件
find . -path "./abc" -prune -o -print
在当前目录下排除abc目录,查找所有以.txt结尾的文件【方式一】
find . -path "./abc" -prune -o -name "*.txt" -print
在当前目录下排除abc目录,查找所有以.txt结尾的文件【方式二】
find . -name "*.txt" -not -path "./abc/*"
在当前目录下排除abc和def目录,查找所有以.txt结尾的文件
find . \( -path ./abc -o -path ./def \) -prune -o -name "*.txt" -print
在当前目录下排除abc目录和def/h.txt文件,查找所有以.txt结尾的文件
find . \( -path ./abc -o -path ./def/h.txt \) -prune -o -name "*.txt" -print
在当前目录下排除abc目录和def/h.txt文件和jk目录,查找所有以.txt结尾的文件
find . \( -path ./abc -o -path ./def/h.txt -o -path ./jk \) -prune -o -name "*.txt" -print
在当前目录下查找所有不是以.html结尾的文件
find . ! -name "*.html" -type f
根据文件或者正则表达式进行匹配
列出当前目录及子目录下所有文件和文件夹
find .
在/home目录下查找以.txt结尾的文件名
find /home -name "*.txt"
同上,但忽略大小写
find /home -iname "*.txt"
当前目录及子目录下查找所有以.txt和.pdf结尾的文件
find . \( -name "*.txt" -o -name "*.pdf" \) 或 find . -name "*.txt" -o -name "*.pdf"
匹配文件路径或者文件
find /usr/ -path "*local*"
基于正则表达式匹配文件路径
find . -regex ".*\(\.txt\|\.pdf\)$"
同上,但忽略大小写
find . -iregex ".*\(\.txt\|\.pdf\)$"
否定参数
找出/home下不是以.txt结尾的文件
find /home ! -name "*.txt"
基于目录深度搜索
向下最大深度限制为3
find . -maxdepth 3 -type f
搜索出深度距离当前目录至少2个子目录的所有文件
find . -mindepth 2 -type f
根据文件时间戳进行搜索
find . -type f 时间戳
UNIX/Linux文件系统每个文件都有三种时间戳:
- 访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
- 修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
- 变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
搜索最近七天内被访问过的所有文件
find . -type f -atime -7
搜索恰好在七天前被访问过的所有文件
find . -type f -atime 7
搜索超过七天内被访问过的所有文件
find . -type f -atime +7
搜索访问时间超过10分钟的所有文件
find . -type f -amin +10
找出比file.log修改时间更长的所有文件
find . -type f -newer file.log
根据文件大小进行匹配
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
-print0 是 find 命令的一个选项,用于将搜索结果打印出来,并使用 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"