Linux find 命令必知必会,很实用

linux   find  
发布于 Jul 30, 2024

find, 顾名思义“查找”的作用,作为 IT 民工,对于基本的 Linux 命令还是要有所掌握的,今天刚好用到了 find , 顺手整理一下个人常用的操作,以备忘,更全面的资料或案例大家可以自行搜索或者查阅 man find.

或者通过下面的网页和PDF查阅。

https://www.gnu.org/software/findutils/manual/html_mono/find.html

https://www.gnu.org/software/findutils/manual/find.pdf

更多 GNU 命令也可以从这个网站直接查询哟!

https://www.gnu.org/manual/manual.html

如果英语水平不好的话,首先我建议你尝试自己读读,读不明白的,可以把链接扔给 AI 助手,翻译一下就好。比如:我问 kimi 翻译 Shell-Pattern-Matching 比请个老外还专业!

find 命令有非常大的灵活性,可以指定丰富的搜索条件(如文件权限、属主、属组、文件类型、日期和大小等)来定位系统中的文件和目录。

find 命令一般使用格式:

find [path...] [expression] [action]
find ./ -name xx
find ./ -name '*.log'

常用过滤参数

  • -name 按文件名查找文件,区分大小写
  • -iname 同上,不区分大小写
  • -path 匹配路径,区分大小写
  • -ipath 同上,不区分大小写
  • -perm 按文件权限来查找文件
  • -user 按文件属主来查找文件
  • -group 按文件属组来查找文件
  • -mtime [+n|-n] 指定时间范围(默认单位天)修改时间,m表示 modify
    • +n 表示文件更改时间距现在n天以前
    • -n 表示文件更改时间距现在n天以内
  • -atime/-ctime 同上,a 表示 access , c 表示 create
  • -mmin/-cmin/-amin 分钟级范围过滤
  • -nogroup 查找无有效所属组的文件
  • -nouser 查找无有效属主的文件
  • -newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。
  • -type 查找某一类型的文件
    • d - 目录
    • l - 符号链接文件
    • f - 普通文件
  • -size n 根据文件尺寸进行检索,支持 + -
    • c 字节
    • k KB
    • M MB
    • G GB
  • -empty 检索空文件或空目录
  • -maxdepth n 限制遍历的层级

常用操作

主要用于操作,显示,删除等

  • -delete 执行删除
  • -exec 执行自定义命令
  • -ls 显示文件信息
  • -ok 询问是否执行某个命令

检索案例赏析

# 查找 /usr 目录下所有文件名以 .txt 结尾的文件
find /usr -name '*.txt' 

# 查找 /usr 目录下所有文件名刚好为 4 个字符的文件
find /usr -name '????' 

# 查找 /usr 下所有文件名以 .txt 结尾的文件,且该文件的父目录必须是 src
find /usr -path '*/src/*.txt'

# 查找 /usr 下所有文件名以 python 开头的目录
find /usr -type d -name 'python*'

# 查找 ~ 家目录所有空目录
find ~ -type d -empty

# 检索 /usr 下所有文件名不以 .txt 为后缀的文件
find /usr -type f ! -name '*.txt'

# 检索 /usr 下所有内容不为空的文件
find /usr -type f ! -empty

# 检索根目录下所有属主为 panda 的文件
find / -type f -user panda

# 检索 /usr 下2天前被修改过的文件
find /usr -type f -mtime 2

# 检索文件大小大于 1 GB 的文件
find . -size +1G

# 检索 /usr 目录下权限为 rwxr-xr-x 的文件
find /usr -perm u=rwx,g=rx,o=rx

# 检索 /usr 目录下权限为 r-xr-xr-x 的文件
find /usr -perm a=rx

# 检索 /usr 目录下所有用户具有执行权限的文件,只关系执行权限,使用 / 表示部分匹配
find /usr -type f -perm /a=x

# 使用数字形式 rw-r--r- 等同于 644
find /usr -perm 644

# 限制遍历的层级,最大 3 级
find / -name '*.log' -maxdepth 3

# 逻辑组合 -a 表示 and , -o 表示 or
find /usr -type d -name 'python*'
# 等价于
find /usr -type d -a -name 'python*'

# 匹配所有文件,但是排除 ./tmp下的文件
# 这个要配合 -o -print 才行
find . -path './tmp*' -prune -o -print

# 查找目录并排序
find . -type d | sort

# 匹配 5分钟以内 或者 50 天前 的文件
find . '(' -mmin -5 -o -mtime +50 ')' -a -type f

操作案例赏析

# 清理用户目录下的所有空目录
find ~ -type d -empty -delete


# 将用户目录下的 mp3 文件拷贝到 /media/MyDrive, 注意后面的 ';' 不能省略
find ~ -type f -name '*.mp3' -exec cp {} /media/MyDrive ';'
# ';' 也可以替换为 \;
find ~ -type f -name '*.mp3' -exec cp {} /media/MyDrive \;
# 每当 find 命令检索到一个符合条件的文件
# 会使用其完整路径取代命令中的 {}
# 然后执行 -exec 后面的命令一次


# 在所有文件中检索文件内容有hello的文件
# 查找文件内容很有用
find ~ -type f -exec grep -l hello {} ';'

# 上面也说了,默认每检索到 1 个匹配的文件就会去执行一次 exec 后面的命令
# 如果有多个 mp3 文件,最终压缩包里只有一个 mp3 文件
# 所以配合 + 号,可以将匹配完的列表作为 {} 中的参数
find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} +

# 查找大于 1G 的文件,并 ls 展示出来
find . -type f -size +1G -ls

# 同上,展现形式不一样,默认的 -ls 展现的更丰富
find . -type f -size +1G -exec ls -l {} \;

# 删除 5 天前的文件
find . -type f -mtime +5 -exec rm {} \;

# 要求用户确认是否删除,需要输入 y 才会执行
find . -empty -type f -ok rm {} \;
< rm ... ./b > ? y
< rm ... ./a > ? n

示例太多了,我也不罗列了,基本够用了,目前大模型时代,有什么问题都可以问 AI 了。

比如:让 kimi 给我列举 100 个 find 案例,可以快速参考。

本次的分享到此结束,希望对你有所帮助。

如果你对我分享的内容感兴趣,欢迎扫码关注公众号:新质程序猿,并设置星标,推送更实时哟!

本文由 黄彦祥 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。
可自由转载、引用,但需署名作者且注明文章出处。