文件和目录管理命令 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.txt
、NOTE.TXT
等。
4. 按文件类型查找
用 -type
指定文件类型,常见的有:
f
:普通文件d
:目录l
:符号链接b
:块设备c
:字符设备
比如,找当前目录下所有普通文件:
find . -type f
找所有目录:
find . -type d
找符号链接:
find . -type l
5. 按文件大小查找
用 -size
按文件大小过滤,单位可以是:
b
:块(512 字节)k
:KBM
:MBG
: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
指定文件系统类型,比如 ext4
、nfs
。
找 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
可能出问题。可以用 -print0
和 xargs -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 {} \;