命令简介

find 命令是 Linux 系统中一个非常强大和常用的命令,用于查找指定目录下的文件或目录。它可以根据各种条件(如名称、大小、权限等)来搜索,并执行指定的操作(如删除、复制等)。

命令格式

1
find [路径] [选项] [操作]

其中:

  • 路径: 指定要在哪个目录下进行查找,如果省略则默认为当前目录。
  • 选项: 用于指定查找条件,如文件名、大小、权限等。
  • 操作:指定对符合条件的文件或目录进行的操作,如删除、复制等。

参数说明

参数 说明 备注
-name 按照文件名进行搜索 支持通配符 * ? []
-iname 按照文件名进行搜索(忽略大小写) 同上
-path 按照文件路径进行搜索 支持通配符
-type 按照文件类型进行搜索 常用类型: f(文件)、d(目录)、l(符号链接)
-size 按照文件大小进行搜索 单位: c(byte)、k(KB)、M(MB)、G(GB)
-perm 按照文件权限进行搜索 使用八进制表示法
-user 按照文件所有者进行搜索 可以是用户名或 UID
-group 按照文件所属组进行搜索 可以是组名或 GID
-mtime 按照文件修改时间进行搜索 单位: 天
-atime 按照文件访问时间进行搜索 单位: 天
-ctime 按照文件状态修改时间进行搜索 单位: 天
-newer 查找比指定文件新的文件 -
-exec 对查找到的文件执行指定操作 需要以 ; 结尾
-ok 对查找到的文件执行指定操作(需要确认) 同上

命令实例

基础用法

1.按文件名查找

1
2
3
4
5
# 在当前目录及子目录下查找所有 .txt 文件
find . -name "*.txt"

# 忽略大小写查找文件名中包含 "test" 的文件
find . -iname "*test*"

2.按文件类型查找

1
2
3
4
5
6
7
8
# 查找当前目录下的普通文件
find . -type f

# 查找当前目录下的目录
find . -type d

# 查找当前目录下的符号链接
find . -type l

3.按文件大小查找

1
2
3
4
5
# 查找大于 1M 的文件
find . -size +1M

# 查找小于 500K 的文件
find . -size -500k

4.按文件权限查找

1
2
3
4
5
# 查找当前目录下权限为 644 的文件
find . -perm 644

# 查找当前目录下其他用户可写的文件
find . -perm /o=w

5.按文件所有者/组查找

1
2
3
4
5
# 查找当前目录下属于 root 用户的文件
find . -user root

# 查找当前目录下属于 users 组的文件
find . -group users

6.按文件时间查找

1
2
3
4
5
6
7
8
# 查找最近 7 天内修改过的文件
find . -mtime -7

# 查找最近 10 天内被访问过的文件
find . -atime -10

# 查找最近 15 天内状态被修改过的文件
find . -ctime -15
  1. 使用 -exec 执行操作
1
2
3
4
5
# 删除当前目录及子目录下所有 .tmp 文件
find . -name "*.tmp" -exec rm -rf {} \;

# 将当前目录下的 .log 文件打包为 log.zip
find . -name "*.log" -exec zip log.zip {} \;

8.结合 xargs 命令执行复杂操作

1
2
3
4
5
# 查找所有大于 10M 的文件并删除它们
# find / -size +10M -exec xargs rm -f {} \; # 待验证

# 或者
find / -size +10M | xargs rm -f

9.使用 -ok 执行操作(需要确认)

1
2
# 删除当前目录及子目录下所有 .bak 文件(需要确认)
find . -name "*.bak" -ok rm {} \;

扩展用法

1.组合条件查找

可以使用逻辑运算符 (-a 表示 AND, -o 表示 OR, ! 表示 NOT) 来组合多个条件进行查找。

1
2
3
4
5
# 查找当前目录下大于 1M 且最近 10 天内修改过的文件
find . -size +1M -a -mtime -10

# 查找当前目录下属于 root 用户或者 users 组的文件
find . \( -user root -o -group users \)

2.使用正则表达式查找

-regex 选项可以使用正则表达式进行匹配。

1
2
# 查找当前目录下以 .c 或 .h 结尾的文件
find . -regex '.*\.\(c\|h\)$'

3.结合 grep 命令过滤结果

1
2
3
4
5
# 查找所有包含字符串 "keyword" 的文件
find / -type f -exec grep -q "keyword" {} \;

# 或者
find / -type f | xargs grep -q "keyword"

高级用法

1.查找并执行命令

-exec 选项不仅可以执行简单的命令,还可以执行复杂的命令或脚本。

1
2
3
4
5
# 查找当前目录下 .jpg 文件,并将它们复制到 images 目录中
find . -name "*.jpg" -exec cp {} images/ \;

# 查找当前目录下的空文件,并删除它们
find . -type f -empty -exec rm -f {} \;

2.使用 -printf 格式化输出

-printf 选项可以自定义 find 命令的输出格式,非常灵活。

1
2
3
4
5
# 输出当前目录下所有文件的完整路径、大小和修改时间
find . -printf "%p %k %TY-%Tm-%Td %TT\n"

# 输出当前目录下所有 .php 文件的行数
find . -name "*.php" -exec wc -l {} \; -printf "'%f' has %l lines\n"

3.使用 find 命令查找符号链接指向的文件

1
2
3
4
5
6
# 查找所有指向 "/home/user/data" 的符号链接
find / -type l -exec readlink {} \; | grep "/home/user/data"

# 输出
/etc/passwd
/etc/shadow

4.使用 find 命令查找空文件

1
2
3
4
5
6
# 查找所有大小为 0 的文件
find / -size 0c

# 输出
/home/user/empty.txt
/home/user/empty.dir/

通过以上实例和扩展用法,相信你已经对 find 命令有了更深入的了解。它确实是一个非常强大的命令,可以极大地提高我们在 Linux 系统下查找文件和执行操作的效率。如果你还有任何疑问或需要进一步探讨,欢迎随时向我提出。