Skip to main content

Linux 核心命令

文件和目录管理命令 find

find 命令是 Linux 里一个超级强大的工具,用来在文件系统中查找文件或目录,然后再对符合条件的文件或者目录进行各种操作,比如:打开、删除、复制、移动等等!

1. 基本用法:从哪找,找啥

find 的基本语法是:

find [路径] [选项] [表达式]
  • 路径:告诉 find 从哪个目录开始找,比如 /home.(当前目录),如果不写路径,默认从当前目录开始。
  • 选项:控制 find 的行为,比如递归深度等等。
  • 表达式:定义你要找啥,比如文件名、类型、时间等。

最简单的例子,列出当前目录下所有文件和目录:

find .

这会递归列出当前目录(.)及其子目录下的所有内容。输出会是文件的完整路径,比如 ./docs/note.txt


2. 指定路径找文件

你可以明确指定路径,比如在 /home/user 里找东西:

find /home/user

如果想找多个路径:

find /home/user /var/log

这会同时在 /home/user/var/log 下搜索。

注意:如果路径没权限,find 会报 Permission denied。可以用 sudo 提升权限,或者重定向错误到 /dev/null

3. 用 -name 按文件名查找

-name 是最常用的选项,用来匹配文件名(大小写敏感)。比如,找所有叫 note.txt 的文件:

find . -name "note.txt"

用通配符 * 模糊匹配,比如找所有 .txt 文件:

find . -name "*.txt"
小贴士:通配符要用引号(单引号或双引号)包起来,不然 Bash 会先把 * 展开,可能导致命令失效。

如果文件名大小写无所谓,用 -iname(忽略大小写):

find . -iname "note.txt"

这会匹配 Note.txtNOTE.TXT 等。


4. 按文件类型查找

-type 指定文件类型,常见的有:

  • f:普通文件
  • d:目录
  • l:符号链接
  • b:块设备
  • c:字符设备

比如,找当前目录下所有普通文件:

find . -type f

找所有目录:

find . -type d

找符号链接:

find . -type l

5. 按文件大小查找

-size 按文件大小过滤,单位可以是:

  • b:块(512 字节)
  • k:KB
  • M:MB
  • G:GB

比如,找大于 10MB 的文件:

find . -type f -size +10M

找小于 100KB 的文件:

find . -type f -size -100k

找正好 50KB 的文件:

find . -type f -size 50k
注意+ 表示大于,- 表示小于,不写符号表示精确匹配。

6. 按修改时间查找

find 可以根据文件的修改时间(mtime)、访问时间(atime)或创建时间(ctime)查找,单位是天。

  • -mtime:修改时间(内容或元数据变更)
  • -atime:访问时间(文件被读取)
  • -ctime:创建时间(或元数据变更)

比如,找过去 7 天内修改过的文件:

find . -type f -mtime -7

找超过 30 天没修改的文件:

find . -type f -mtime +30

如果想按分钟算,用 -mmin-amin-cmin。比如,找最近 60 分钟内访问的文件:

find . -type f -amin -60

7. 按权限查找

-perm 查找特定权限的文件。权限可以用八进制(比如 644)或符号表示(比如 u=rw)。

找所有用户可读写的文件(权限 644):

find . -type f -perm 644

找所有者可写但组和其他用户不可写的文件:

find . -type f -perm -u+w ! -perm -go+w
解释! 是逻辑非,-go+w 表示组或其他用户可写。

8. 按用户或组查找

-user-group 按文件的所有者或所属组查找。

找用户 alice 拥有的文件:

find . -type f -user alice

找组 developers 的文件:

find . -type f -group developers

如果用户或组不存在,可以用 UID 或 GID:

find . -type f -uid 1000

9. 组合条件:与、或、非

find 支持逻辑运算符:

  • -a 或者 -and:与(默认)
  • -o 或者 -or:或
  • !:非

比如,找 .txt.doc 文件:

find . -type f \( -name "*.txt" -o -name "*.doc" \)
注意-o 两边要用括号 \( \),不然优先级会出问题。

找不是 .txt 的文件:

find . -type f ! -name "*.txt"

找大于 1MB 且 7 天内修改的文件:

find . -type f -size +1M -mtime -7

10. 限制搜索深度

-maxdepth 控制递归深度。比如,只搜索当前目录和一级子目录:

find . -maxdepth 2

-mindepth 设置最小深度,比如只找两级子目录以下的文件:

find . -mindepth 2

11. 执行操作:-exec

找到文件后,可以用 -exec 对结果执行命令。语法是:

find [路径] [选项] -exec 命令 {} \;
  • {} 表示找到的文件路径。
  • \; 表示命令结束。

比如,删除所有 .bak 文件:

find . -type f -name "*.bak" -exec rm -v {} \;

把找到的文件复制到 /backup

find . -type f -name "*.txt" -exec cp {} /backup \;

如果要批量操作所有文件,用 + 代替 \;

find . -type f -name "*.txt" -exec cat {} +
区别\; 每次处理一个文件,+ 把所有文件攒一起处理,效率更高。

12. 处理空文件或目录

-empty 查找空文件或空目录。

找空文件:

find . -type f -empty

找空目录:

find . -type d -empty

删除所有空目录:

find . -type d -empty -exec rmdir {} \;

13. 按正则表达式查找

-regex-iregex(忽略大小写)按正则表达式匹配文件路径。

找以 note 开头,.txt 结尾的文件:

find . -type f -regex ".*note.*\.txt"
注意-regex 匹配的是完整路径,比如 ./docs/note.txt,所以要用 .* 匹配路径前缀。

14. 查找并排序结果

find 本身不排序,但可以配合 sort

find . -type f -name "*.txt" | sort

按文件大小排序(需要用 ls -l):

find . -type f -name "*.txt" -exec ls -l {} + | sort -k 5 -n

15. 查找特定文件系统类型

-fstype 指定文件系统类型,比如 ext4nfs

ext4 文件系统上的文件:

find / -fstype ext4 -type f

16. 跳过某些目录

-prune 跳过特定目录。比如,跳过 .git 目录:

find . -path "./.git" -prune -o -type f -print
解释-prune 阻止 find 进入匹配的目录,-o -print 打印其他结果。

17. 查找并统计

想知道找到多少文件?用 wc -l

find . -type f -name "*.txt" | wc -l

统计 .txt 文件的总大小:

find . -type f -name "*.txt" -exec du -ch {} + | grep total

18. 处理特殊字符文件名

如果文件名有空格或特殊字符,-exec 可能出问题。可以用 -print0xargs -0

find . -type f -name "*.txt" -print0 | xargs -0 ls -l

-print0 用空字符分隔路径,避免空格问题。


19. 查找并直接打开

想直接打开找到的文件?可以用 -exec 配合工具,比如用 xdg-open 打开所有 .pdf 文件:

xdg-open 打开(适用于图片、PDF 等):

find . -type f -name "*.pdf" -exec xdg-open {} \;