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 案例,可以快速参考。
好了,本文就先分享到这里吧,可以关注,收藏备用哟!