find
命令是 Linux 系统中常用的文件搜索工具,用于在指定目录及其子目录下查找符合条件的文件或目录。它可以根据文件名、文件类型、文件大小、文件权限、修改时间等多种属性进行搜索。
常用的 find
命令语法如下:
find [path] [expression]
其中 path
参数表示要搜索的目录路径,如果不指定,则默认搜索当前目录及其子目录。expression
参数则是搜索条件表达式,可以使用一系列选项和测试来定义搜索规则。
-name pattern
:按照文件名模式进行匹配搜索。pattern
可以使用通配符进行模式匹配,如 *.txt
。-type type
:按照文件类型进行匹配搜索。type
可以是以下几种类型之一:
f
:普通文件d
:目录l
:符号链接b
:块设备文件c
:字符设备文件s
:套接字文件p
:命名管道文件-size [+|-]n[cbkMG]
:按照文件大小进行匹配搜索。+
表示大于,-
表示小于,n
是具体的大小,[cbkMG]
是可选的单位后缀,分别表示字节、KB、MB、GB 和 TB。例如,-size +1M
表示文件大小大于 1MB。-mtime [+|-]n
:按照文件修改时间进行匹配搜索。+
表示早于,-
表示晚于,n
表示天数。例如,-mtime +7
表示修改时间早于 7 天前的文件。-user owner
:按照文件所有者进行匹配搜索。-group group
:按照文件所属组进行匹配搜索。-perm mode
:按照文件权限进行匹配搜索。mode
可以使用八进制或符号格式表示权限。例如,-perm 644
表示权限为 644 的文件。-iname pattern
:类似于 -name
,但忽略模式的大小写。-ipath pattern
:类似于 -path
,但忽略模式的大小写。-regex pattern
:使用正则表达式进行匹配搜索。pattern
是一个正则表达式,用于匹配文件名。-iregex pattern
:类似于 -regex
,但忽略正则表达式的大小写。-exec command {} \;
:对搜索到的每个文件执行指定的命令。{}
会被搜索到的文件名替换。-ok command {} \;
:与 -exec
选项类似,但在执行命令之前会询问用户是否继续。-delete
:删除搜索到的文件。-print
:将搜索到的文件名打印到标准输出。-depth
:首先处理深度较大的目录,然后再处理浅层的目录。-maxdepth levels
:限制搜索的最大深度。levels
表示目录层级数。-mindepth levels
:限制搜索的最小深度。levels
表示目录层级数。-prune
:排除指定的目录,不进入其中进行搜索。.txt
的文件:find . -name "*.txt"
结果:
./file1.txt
./dir1/file2.txt
./dir2/file3.txt
/home
目录下大于 1MB 的普通文件:find /home -type f -size +1M
结果:
/home/user1/largefile.txt
/home/user2/documents/bigdocument.docx
/var/log
目录下修改时间早于 7 天前的日志文件:find /var/log -type f -mtime +7
结果:
/var/log/syslog
/var/log/auth.log
/etc
目录下所有属于 root
用户的文件:find /etc -user root
结果:
/etc/passwd
/etc/shadow
/etc/ssh/sshd_config
.bak
的文件:find . -name "*.bak" -delete
执行后,这些文件将被永久删除。
file
的文件,不区分大小写:find . -iname "*file*"
结果:
./file1.txt
./dir1/file2.txt
./dir2/file3.txt
./dir2/otherfile.txt
/usr/bin
目录下所有符号链接文件:find /usr/bin -type l
结果:
/usr/bin/python -> python2.7
/usr/bin/python2 -> python2.7
/usr/bin/java -> /etc/alternatives/java
.log
结尾的文件,并将结果输出到 ~/logs.txt
文件中:find . -name "*.log" -print > ~/logs.txt
执行后,在 ~/logs.txt
文件中会列出所有搜索到的文件名。
/home
目录中搜索所有属于 users
组的文件,并将这些文件的权限设置为 rw-rw-r--
:find /home -group users -exec chmod 664 "{}" \;
执行后,这些文件的权限将被修改为 rw-rw-r--
。
.log
结尾的文件,但排除 ./logs
子目录:find . -path "./logs" -prune -o -name "*.log" -print
结果:
./file1.log
./dir1/file2.log
./otherdir/logfile.log