Linux 系统 find 命令详解

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:排除指定的目录,不进入其中进行搜索。

常用用法

1. 搜索当前目录下所有扩展名为 .txt 的文件:
复制代码
find . -name "*.txt"

结果:

复制代码
./file1.txt
./dir1/file2.txt
./dir2/file3.txt
2. 搜索 /home 目录下大于 1MB 的普通文件:
复制代码
find /home -type f -size +1M

结果:

复制代码
/home/user1/largefile.txt
/home/user2/documents/bigdocument.docx
3. 搜索 /var/log 目录下修改时间早于 7 天前的日志文件:
复制代码
find /var/log -type f -mtime +7

结果:

复制代码
/var/log/syslog
/var/log/auth.log
4. 搜索 /etc 目录下所有属于 root 用户的文件:
复制代码
find /etc -user root

结果:

复制代码
/etc/passwd
/etc/shadow
/etc/ssh/sshd_config
5. 删除当前目录及其子目录中所有扩展名为 .bak 的文件:
复制代码
find . -name "*.bak" -delete

执行后,这些文件将被永久删除。

6. 搜索当前目录下所有名字中包含 file 的文件,不区分大小写:
复制代码
find . -iname "*file*"

结果:

复制代码
./file1.txt
./dir1/file2.txt
./dir2/file3.txt
./dir2/otherfile.txt
7. 搜索 /usr/bin 目录下所有符号链接文件:
复制代码
find /usr/bin -type l

结果:

复制代码
/usr/bin/python -> python2.7
/usr/bin/python2 -> python2.7
/usr/bin/java -> /etc/alternatives/java
8. 在当前目录及其子目录中搜索所有名字以 .log 结尾的文件,并将结果输出到 ~/logs.txt 文件中:
复制代码
find . -name "*.log" -print > ~/logs.txt

执行后,在 ~/logs.txt 文件中会列出所有搜索到的文件名。

9. 在 /home 目录中搜索所有属于 users 组的文件,并将这些文件的权限设置为 rw-rw-r--
复制代码
find /home -group users -exec chmod 664 "{}" \;

执行后,这些文件的权限将被修改为 rw-rw-r--

10. 搜索当前目录及其子目录中名字以 .log 结尾的文件,但排除 ./logs 子目录:
复制代码
find . -path "./logs" -prune -o -name "*.log" -print

结果:

复制代码
./file1.log
./dir1/file2.log
./otherdir/logfile.log
相关推荐
两斤半16 分钟前
Debian TTY环境乱码
linux·debian
还是奇怪1 小时前
Linux - 安全排查 2
linux·运维·安全
牛奶咖啡132 小时前
Linux系统的常用操作命令——文件远程传输、文件编辑、软件安装的四种方式
运维·服务器·软件安装·linux云计算·scp文件远程传输·vi文件编辑·设置yum的阿里云源
weixin_437398212 小时前
转Go学习笔记(2)进阶
服务器·笔记·后端·学习·架构·golang
难受啊马飞2.02 小时前
如何判断 AI 将优先自动化哪些任务?
运维·人工智能·ai·语言模型·程序员·大模型·大模型学习
会又不会2 小时前
Jenkins-Email Extension 插件插件
运维·jenkins
电脑能手3 小时前
[保姆级教程] 解决不同局域网电脑无法SSH的问题
运维·ssh·电脑
tan77º3 小时前
【Linux网络编程】Socket - UDP
linux·服务器·网络·c++·udp
czhc11400756633 小时前
Linux 76 rsync
linux·运维·python
szxinmai主板定制专家4 小时前
【精密测量】基于ARM+FPGA的多路光栅信号采集方案
服务器·arm开发·人工智能·嵌入式硬件·fpga开发