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
查找某一类型的文件
-size n
根据文件尺寸进行检索,支持 + -
-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 案例,可以快速参考。
本次的分享到此结束,希望对你有所帮助。
如果你对我分享的内容感兴趣,欢迎扫码关注公众号:新质程序猿,并设置星标,推送更实时哟!