The find
Linux 中的命令是一个功能强大的实用程序,用于根据您指定的条件搜索和定位文件和目录。
它可以按名称、大小、类型、权限、日期和许多其他标准快速定位文件。
基本语法
的基本语法为find
命令是:
find [path...] [expression]
-
path
:您可以在此处指定开始搜索的目录。例如,您可以从根目录开始搜索(/
)或从您的主目录(~
).
-
expression
:这是要匹配的条件或标准。例如,您可以按名称、大小、类型等搜索文件。
Output:
$ find /home/user -name myfile.txt
/home/user/documents/myfile.txt
这将搜索/home/user
名为的文件的目录myfile.txt
.
按名称查找文件
区分大小写
您可以使用-name
选项后跟文件名或模式以按名称搜索文件。
$ find /home/user -name notes.txt
/home/user/documents/notes.txt
/home/user/backups/notes.txt
该命令检查/home/user
所有名为的文件的目录notes.txt
.
不区分大小写
如果要执行不区分大小写的搜索,请使用-iname
option.
$ find /home/user -iname Notes.TXT
/home/user/documents/notes.txt
/home/user/backups/NOTES.txt
在这里,搜索检索名为“notes.txt”、“NOTES.TXT”的文件以及大小写的任何其他变体。
使用正则表达式
find
还可以基于正则表达式匹配文件,提供更灵活的搜索模式。
使用-正则表达式
The -regex
选项基于文件的完整路径进行搜索。
$ find /home/user -regex "/home/user/docs/.*\.txt$"
/home/user/docs/report.txt
/home/user/docs/summary.txt
该命令检索所有.txt
里面的文件/home/user/docs
目录。
使用 -iregex
要执行不区分大小写的正则表达式搜索,请使用-iregex
option.
$ find /home/user -iregex "/home/user/DOCS/.*\.txt$"
/home/user/docs/report.txt
/home/user/DOCS/Overview.TXT
这返回.txt
来自两者的文件/home/user/docs
and /home/user/DOCS
目录,无论大小写。
阅读更多有关如何使用的信息正则表达式与 Linux find 命令.
按类型查找文件
您可以使用-type
选项后跟特定代码,指示文件类型以根据文件类型搜索文件。
要搜索常规文件,您可以使用f
code:
$ find /home/user -type f
/home/user/file1.txt
/home/user/image.png
这列出了所有常规文件/home/user
目录。
要搜索目录,您可以使用d
code:
$ find /home/user -type d
/home/user/documents
/home/user/pictures
该命令返回目录中的所有目录/home/user
目录。
要搜索符号链接,您可以使用l
code:
$ find /home/user -type l
/home/user/link_to_file1.txt
这列出了所有符号链接/home/user
.
其他文件类型:
-
b
:块设备文件
-
c
:字符设备文件
-
p
:命名管道(FIFO)
-
s
:套接字文件
例如,要查找所有块设备文件:
$ find / -type b
/dev/sda
/dev/sdb
这将检索系统中的所有块设备。
按大小查找文件
要根据文件大小搜索文件,您可以使用-size
option.
$ find /home/user -size +2M
/home/user/movies/sample.mp4
/home/user/backups/backup.tar.gz
该命令列出了目录中的文件/home/user
大于 2 MB 的目录。
了解尺寸格式
可以使用各种格式指定大小标准:
-
c
: bytes
-
k
:千字节
-
M
:兆字节
-
G
:千兆字节
尺寸单位前的符号表示条件:
-
+
: 大于指定尺寸
-
-
: 小于指定尺寸
- (无符号):完全符合指定尺寸
$ find /home/user -size -10k
/home/user/notes.txt
/home/user/config.yaml
这会找到文件/home/user
小于 10 KB。
查找空文件或目录
The -empty
选项允许您找到空文件或目录。
$ find /home/user -type f -empty
/home/user/emptyfile.txt
/home/user/drafts/untitled.doc
该命令列出了所有空的常规文件/home/user
目录。
查找空目录:
$ find /home/user -type d -empty
/home/user/drafts/unused_folder
这将返回其中的所有空目录/home/user
.
按日期和时间查找文件
您可以使用 find 命令使用多个选项来按访问日期/时间或修改日期/时间搜索文件。
按访问时间搜索
您可以使用-amin
选项来搜索在指定分钟数内访问的文件。
$ find /home/user -amin -10
/home/user/documents/recently_opened.txt
该命令检索文件/home/user
最近 10 分钟内访问过。
您可以使用-atime
搜索过去“n”天内访问过的文件的选项。
$ find /home/user -atime -7
/home/user/documents/week_report.txt
这将文件定位在/home/user
过去一周内访问过。
按 inode 变化搜索
您可以使用-cmin
根据 inode 更改时间(以分钟为单位)搜索文件的选项。
inode 包含对文件元数据的更改,例如其权限或所有权,但不一定是其内容。
$ find /home/user -cmin -30
/home/user/configs/changed_config.cfg
该命令查找文件/home/user
他们的索引节点在过去 30 分钟内发生了更改。
您可以使用-ctime
根据 inode 更改时间(以天为单位)搜索文件的选项。
$ find /home/user -ctime -2
/home/user/configs/recently_changed_config.cfg
这将文件定位在/home/user
他们的 inode 在过去 2 天内发生了变化。
按修改时间搜索
您可以使用-mmin
根据修改时间(以分钟为单位)搜索文件的选项。
$ find /home/user -mmin -15
/home/user/documents/just_edited.txt
这会找到文件/home/user
在过去 15 分钟内进行了修改。
要根据修改时间(以天为单位)搜索文件,您可以使用-mtime
option:
$ find /home/user -mtime -3
/home/user/documents/three_days_ago_edited.txt
这将返回文件/home/user
过去 3 天内修改过的内容。
查找较新的文件
您可以使用-newer
选项来查找比给定文件更新的文件。
$ find /home/user -newer reference.txt
/home/user/documents/updated_report.txt
这列出了以下位置的文件/home/user
比reference.txt
.
使用 -newerXY 比较时间戳
The -newerXY
选项允许您将文件的时间戳与另一个文件或特定时间进行比较。 X 和 Y 可以是:
-
a
:访问时间
-
m
: 修改时间
-
c
:inode改变时间
-
t
:文字时间(直接指定)
例如,要查找最近修改的文件比访问时间更晚的文件:
$ find /home/user -neweram reference.txt
/home/user/documents/recently_edited_but_not_opened.txt
该命令列出了以下位置的文件/home/user
与访问时间相比,其修改时间更新reference.txt
.
要与特定日期进行比较,您可以使用:
$ find /home/user -newermt "2023-08-18"
/home/user/documents/post_august_file.txt
这会找到文件/home/user
2023 年 8 月 18 日后修改。
修改后访问的文件
The -used
选项允许您根据文件上次访问和上次修改之间的天数来搜索文件。
$ find /home/user -used +7
/home/user/old_drafts/draft1.txt
该命令列出了以下位置的文件/home/user
上次访问距上次修改时间超过 7 天。此类文件可能已被修改,然后在一段时间内保持不变。
请记住,这不会直接根据上次访问时间或修改时间向您显示文件;相反,它会根据这两次之间的天数差异向您显示文件。
按权限查找文件
The -perm
选项允许您根据文件的权限搜索文件。
$ find /home/user -perm 0755
/home/user/scripts/executable_script.sh
该命令列出了以下位置的文件/home/user
权限设置为0755
.
您还可以使用符号表示:
$ find /home/user -perm u=rwx,g=rx,o=rx
/home/user/scripts/executable_script.sh
这将检索与上一个命令相同的文件,但使用符号表示法表示权限。
对于与任何给定模式匹配的权限:
$ find /home/user -perm -o=w
/home/user/shared/shared_file.txt
这会找到文件/home/user
其他人有写权限的地方。
搜索具有特殊权限的文件
您可以使用-perm
选项结合特定代码来搜索具有特殊权限的文件,例如粘性位、setuid 和 setgid。
粘位
您可以使用-1000
搜索设置了粘性位的文件的代码将具有t
在他们的权限中。
$ find /home/user -perm -1000
/home/user/shared_directory
这会找到目录/home/user
与粘性位设置。
Setuid
要搜索设置了 setuid 位的文件,将具有s
在用户的执行权限中,您可以使用-4000
code.
$ find /home/user -perm -4000
/home/user/bin/setuid_program
这列出了以下位置的文件/home/user
设置了 setuid 位。
Setgid
您可以使用-2000
搜索设置了 setgid 位的文件的代码将具有s
在组的执行权限中。
$ find /home/user -perm -2000
/home/user/bin/setgid_program
这将返回文件/home/user
设置了 setgid 位。
按用户和组搜索
要根据所有权搜索文件,您可以使用以下选项:
-user
您可以使用-user
搜索特定用户拥有的文件的选项。
$ find /home/user -user john
/home/user/johns_file.txt
这列出了以下位置的文件/home/user
归用户所有john
.
-group
您可以使用-group
搜索属于特定组的文件的选项。
$ find /home/user -group developers
/home/user/dev/project1.txt
这将检索文件/home/user
属于developers
group.
-nouser
您可以使用-nouser
选项来查找没有与其关联的有效用户的文件。
$ find / -nouser
/orphaned_files/file1.txt
这会列出根目录中没有有效用户所有者的文件。
-nogroup
您可以使用-nogroup
选项来查找不属于任何有效组的文件。
$ find / -nogroup
/orphaned_files/file2.txt
这将定位根目录中没有有效组的文件。
排除目录
如果您需要从搜索中排除某些目录,您可以使用-prune
option.
$ find /home/user -path '/home/user/excluded_directory' -prune -o -print
/home/user/file1.txt
/home/user/other_directory/file2.txt
在这里,搜索避免了excluded_directory
同时打印其他结果/home/user
.
请记住:顺序很重要-prune
。确保在之前指定要修剪的内容-o -print
部分,否则你会得到意想不到的结果。
搜索文件的硬链接
The -samefile
选项可帮助您搜索与指定文件指向相同 inode 的文件,本质上是查找指向该文件的硬链接。
$ find /home/user -samefile /home/user/reference.txt
/home/user/reference.txt
/home/user/links/reference_hardlink.txt
该命令识别所有文件/home/user
指向相同的 inodereference.txt
,在本例中包括原始文件及其硬链接。
组合多个搜索条件
有时,您需要根据多个条件进行搜索。这find
命令足够灵活,可以组合各种搜索条件。
组合条件
To find .txt
最近 3 天内修改的文件:
$ find /home/user -name "*.txt" -mtime -3
/home/user/recently_edited.txt
使用 -o(或)
要搜索.txt
or .md
files:
$ find /home/user -name "*.txt" -o -name "*.md"
/home/user/note.txt
/home/user/readme.md
使用 -a(与)
While -a
是默认的,如果想明确的话可以用它来组合条件。
To find .txt
过去 3 天内修改且大于 1k 的文件:
$ find /home/user -name "*.txt" -a -mtime -3 -a -size +1k
/home/user/large_recently_edited.txt
使用 ! (不是)
您可以使用!
否定搜索条件。
查找不存在的文件.txt
:
$ find /home/user ! -name "*.txt"
/home/user/image.jpg
这将返回所有文件/home/user
没有.txt
扩大。
限制搜索深度
有时您可能想要限制搜索的深度。这是哪里-maxdepth
and -mindepth
参加进来。
maxdepth
The -maxdepth
限制目录遍历的深度。
$ find /home/user -maxdepth 1 -name "*.txt"
/home/user/file1.txt
这发现.txt
文件在/home/user
但不搜索子目录。
mindepth
The -mindepth
指定目录遍历的最小深度。
$ find /home/user -mindepth 2 -name "*.txt"
/home/user/subdir/file2.txt
这会搜索.txt
文件在/home/user
但仅从第二级目录开始。
对找到的文件执行命令
您可以直接根据结果采取行动。
使用-exec
The -exec
选项允许您对每个找到的项目运行命令。
$ find /home/user -name "*.txt" -exec cp {} /home/backup/ \;
该命令查找所有.txt
文件在/home/user
并将它们复制到/home/backup/
目录。
使用-execdir
如同-exec
,而是在匹配文件所在的目录中执行指定的命令。
$ find /home/user -name "config.cfg" -execdir mv {} {}.backup \;
这将重命名所有config.cfg
找到的文件/home/user
to config.cfg.backup
.
使用 {} + 和 {} 安全执行;
Using {} +
允许一次将多个文件名作为参数传递。
$ find /home/user -name "*.txt" -exec echo {} +
/home/user/file1.txt /home/user/file2.txt
Using {} \;
确保分别对每个文件执行该命令。
$ find /home/user -name "*.txt" -exec echo {} \;
/home/user/file1.txt
/home/user/file2.txt
使用-delete
The -delete
操作使您能够删除符合搜索条件的文件或目录。
$ find /home/user -name "*.tmp" -delete
The -delete
操作以深度优先方式处理删除,因此在删除目录本身之前,目录中的文件将被清空。这在处理目录时至关重要。
Using -delete
可能会导致数据丢失。这就是为什么您需要确认,例如-ok
行动提供。
确认操作(使用 -ok)
The -ok
行动于find
命令在对找到的文件执行命令时起到保护作用。
$ find /home/user -name "*.bak" -ok rm {} \;
< rm ... /home/user/documents/file1.bak > ? y
< rm ... /home/user/documents/file2.bak > ? n
对于每个文件,find
提示您它打算执行的完整命令(例如,< rm ... /home/user/documents/file1.bak > ?
).
对于每个文件,您必须回答“y”(是)或“n”(否)。仅处理用“y”确认的文件。
使用 -okdir
就像-ok
,它会在执行命令之前提示用户确认。
然而,-okdir
从包含匹配文件的目录执行指定的命令,这使得如果使用不正确的路径执行可能会产生意外后果的命令更安全。
$ find /home/user -name "*.bak" -okdir rm {} \;
< rm ... file1.bak > ? y
< rm ... file2.bak > ? n
Unlike -ok
,显示完整路径,-okdir
显示文件名,因为该命令是在文件目录中执行的。
-ok 与 -okdir
使用时-ok
,您正在执行的命令是从您调用的目录运行的find
命令。这{}
占位符将替换为匹配文件的完整路径。
相反,当您使用-okdir
,该命令从包含匹配文件的目录运行,并且{}
占位符将被匹配文件的基本名称替换(即没有前面的目录路径)。
So, -okdir
增加了一层安全性。
将 Find 与 Xargs 一起使用
xargs
是一个功能强大的工具,可以从标准输入读取项目并对其执行命令。
它经常与find
处理文件名和其他输入。
$ find /home/user -name "*.txt" | xargs tar cvf backup.tar
backup.tar
/home/user/file1.txt
/home/user/file2.txt
该命令打包所有.txt
找到的文件/home/user
into a backup.tar
档案。
对于带有空格或特殊字符的文件名,使用更安全:
$ find /home/user -name "*.txt" -print0 | xargs -0 tar cvf backup.tar
Here, -print0
in find
and -0
in xargs
确保正确处理文件名,即使它们包含空格、换行符或其他特殊字符。
处理带有特殊字符的文件
当使用包含特殊字符(例如空格或括号)的文件名时,必须确保正确处理它们。
$ find /home/user -name "my file*.txt"
/home/user/my file1.txt
/home/user/my file2.txt
如果您正在编写脚本或链接命令,请引用模式:
$ find /home/user -name "my file*.txt" -exec cat '{}' \;
Contents of my file1.txt
Contents of my file2.txt
通过包裹{}
在单引号中,您确保带有特殊字符的文件名被传递到cat
命令没有问题。
使用-sparse
The -sparse
选项标识稀疏分配的文件。稀疏文件占用的实际磁盘空间比其表面大小所暗示的要少。
$ find /home/user -sparse
/home/user/large_but_sparse_file.img
这会找到文件/home/user
那些稀疏的。通常,这些文件的块读为零,但不占用磁盘上的任何空间。
打印结果
默认情况下,find
打印满足指定条件的文件名。然而,还有更复杂的方法来打印结果。
打印文件名
The -print
选项允许您打印完整的文件名。
$ find /home/user -name "sample.txt"
/home/user/documents/sample.txt
格式化输出
The -printf
选项允许自定义输出格式。
$ find /home/user -name "sample.txt" -printf "%f %s bytes\n"
sample.txt 1240 bytes
这仅打印文件名(%f
)及其大小(以字节为单位)(%s
),后面跟着单词“字节”。
详细清单
The -ls
选项提供了类似于的详细列表ls -l
.
$ find /home/user -name "sample.txt" -ls
1234567 4 -rw-r--r-- 1 user user 1240 Aug 16 12:30 /home/user/documents/sample.txt
输出显示索引节点号、块大小、文件权限、链接数、所有者、组、字节大小、修改时间和文件名。
搜索特定安装的设备(-xdev 或 -mount)
当使用大型文件系统或多个安装点时,将搜索限制为特定文件系统可以改善find
命令的性能。
Both -xdev
and -mount
是相同的选项,只是名称不同。该选项可防止find
从下降到驻留在不同文件系统(或分区)上的目录。
如果您正在搜索类似的目录,这会很有用/
(root)但您不想搜索其他已安装的文件系统,例如/boot
or /home
如果它们位于不同的分区或设备上。
Example:假设您想找到所有.log
文件在/var
目录但不进入其他已安装的文件系统:
$ find /var -xdev -name "*.log"
在这个例子中,如果/var/log
是一个单独的安装点或位于不同的分区上,-xdev
or -mount
会阻止find
从向内寻找/var/log
.
Note: 放置很重要-xdev
or -mount
任何谓词之前的选项,例如-name
以确保它被视为一种选择。
Find 命令的强大功能
有一天,我接到客户服务部主管的紧急电话。他们告诉我,许多客户报告没有收到他们的月度报表。
我快速调出日志,发现有超过 100,000 个文件,分布在多个目录和子目录中,其中包含这些语句。
主要问题是这些文件的很大一部分被错误命名,并且由于这种命名不一致,它们无法发送给各自的客户。
如果这是一项手动任务,那将是一场灾难。即使团队规模相当大,检查 100,000 个文件也需要几天甚至几周的时间。
为了便于论证,假设一个人每小时可以处理 100 个文件。一天工作 8 小时,即 800 个文件。
要覆盖 100,000 个文件,需要 125 个工作日。即使团队有 10 人,我们也需要近两周的工作时间。
这就是Linux的神奇之处find
命令进来了。
我使用了一个简单的命令:
$ find /path_to_directory/ -type f -name "wrong_pattern_*"
很快,它就给了我所有命名错误的文件的列表,无论它们的目录深度如何。使用相同的命令,我将其与重命名操作结合起来:
$ find /path_to_directory/ -type f -name "wrong_pattern_*" -exec rename 's/wrong_pattern_/correct_pattern_/' '{}' \;
几分钟之内,所有命名错误的文件都被正确重命名。
发送语句的批处理过程重新运行,在几个小时内,所有语句都被正确发送。
Resource
https://man7.org/linux/man-pages/man1/find.1.html