
Linux find 命令超完整详解一、概述find是 Linux/Unix 下递归遍历文件系统的检索工具核心能力 按文件名、文件类型、大小、时间、权限、所有者、深度等条件筛选文件并可对匹配文件执行自定义操作。特点直接扫描磁盘不依赖数据库对比locate支持复杂多条件组合。语法格式find [起始搜索路径] [表达式]表达式由测试条件 (test)、操作 (action)、运算符 (operator)组成。 默认动作-print打印匹配文件路径二、基础选项全局控制参数1.-maxdepth n最大递归深度控制向下搜索几层写在路径后面、条件前面find . -maxdepth 1 -name *.txt # 只查当前目录不进子目录 find /data -maxdepth 2 # 当前目录 一级子目录2.-mindepth n最小深度忽略浅层目录find . -mindepth 2 -name *.log # 跳过当前目录从一级子目录开始搜索三、【测试条件 Test】重点筛选规则1. 按名称匹配表格参数说明-name PATTERN匹配文件名区分大小写支持通配符* ? []-iname PATTERN忽略大小写-path PATTERN匹配完整路径不是单纯文件名-ipath PATTERN路径匹配、忽略大小写-regex 正则使用正则匹配完整路径⚠️ 通配符一定要加引号防止 shell 提前展开 示例find . -name *.sh find . -iname readme find . -path *src/*.py2. 文件类型-type-type f # 普通文件 -type d # 目录 directory -type l # 符号链接 link -type s # socket套接字 -type p # 管道文件 fifo -type b # 块设备 -type c # 字符设备运行find . -type d -name logs3. 文件大小-size单位c字节 |kKB |MMB |GGB 前缀大于-小于无符号等于find . -size 100M # 大于100MB find . -size -10k # 小于10KB find . -size 0c # 空文件4. 时间类参数高频难点三种时间-mtimemodify文件内容修改时间最常用-ctimechange文件元数据修改权限、属主、文件名改动-atimeaccess文件被读取访问时间很多系统挂载 noatime不准确单位天24 小时plaintext-mtime 7 # 修改时间 超过7天 -mtime -7 # 7天以内修改 -mtime 7 # 刚好第7~8天之间分钟版本-mmin / -cmin / -amin运行find . -mmin -60 # 一小时内改动文件扩展对比参考时间-newerfind . -newer test.txt # 找出比test.txt更新的所有文件5. 权限、属主、属组-user username # 文件归属指定用户 -group groupname # 文件归属指定组 -uid 1000 # UID编号 -gid 1000 # GID编号 -perm MODE # 精确匹配权限 -perm -MODE # 包含这些权限只要拥有对应bit即可 -perm /MODE # 任意一类满足权限ugo任意一个匹配示例查找 SUID 程序find / -perm -4000 -type f -xdev6. 文件属性-empty # 空文件 或 空目录 -readable # 当前用户可读 -writable # 当前用户可写 -executable # 当前用户可执行7. 路径裁剪-prune高级排除目录语法模板find 搜索路径 -path 排除目录 -prune -o [其他条件] -print示例搜索当前目录跳过 .git 目录find . -path ./.git -prune -o -name *.js -print-prune含义如果匹配路径则不进入该目录递归-o等价 or前面条件不成立才执行后面四、运算符多条件组合优先级! 括号()-and-or! 条件 等价 -not 取反 -a / -and 逻辑与默认不加运算符就是and -o / -or 逻辑或 \( 条件 \) 括号分组注意转义空格不能少示例# 找到 .log 或者 .txt 文件 find . -name *.log -o -name *.txt # 找出普通文件并且不是以.tmp结尾 find . -type f ! -name *.tmp # 复杂组合大于10M的mp4 或者 avi文件 find . \( -name *.mp4 -o -name *.avi \) -size 10Mshell 中()是特殊字符必须写成\( \)五、【动作 Action】匹配成功后执行操作1.-print默认动作打印文件完整路径换行分隔2.-exec执行外部命令格式 1-exec CMD {} \;{} 代表每一个匹配到的文件\;命令结束标记每条文件单独起进程find . -name *.log -exec ls -l {} \; find . -name *.old -exec rm -f {} \;格式 2-exec CMD {} 尽可能把多个文件一次性传给命令减少进程创建效率更高类似xargsfind . -name *.txt -exec cat {} 3.-ok和-exec功能一致但每次执行前交互式询问 y/n适合删除前确认find . -name *.tmp -ok rm {} \;4.-ls类似 ls -dils 列出文件详细信息find . -type f -ls7.-fls file把-ls的输出写入指定文件8.-printf 格式自定义输出常用格式符%p 文件完整路径 %f 仅文件名 %h 文件所在目录 %s 文件大小(bytes) %t 修改时间 %U 用户名 %G 组名示例只打印文件名find . -type f -printf %f\n六、find 执行逻辑底层原理很多人不懂find 按顺序遍历目录树对每个文件依次执行表达式从左向右依次判断条件条件结果为true继续向后false 停止后续判断到达动作-print/-exec就执行重要陷阱动作也是表达式的一部分例find . -name *.txt -print -delete匹配成功先 print再 delete如果调换顺序find . -name *.txt -delete -print先删除再打印打印已经被删掉的文件无输出七、高频实战模板# 1. 只查找当前目录一级不递归子目录 find . -maxdepth 1 -type f # 2. 查找30天前日志并删除运维清理日志经典命令 find /var/log -name *.log -mtime 30 -delete # 3. 查找空文件并列出 find . -type f -size 0c # 4. 文件名包含空格安全删除组合 find . -name *.zip -print0 | xargs -0 rm -f find . -name *.zip -delete无需管道更简洁 # 5. 查找所有777权限文件 find / -type f -perm 777 -xdev # 6. 搜索排除 node_modules 目录 find . -path ./node_modules -prune -o -name *.js -print # 7. 查找一小时内修改过的shell脚本 find . -name *.sh -mmin -60 # 8. 查找后缀.log 或者 .txt 文件逻辑或必须分组 find . \( -name *.log -o -name *.txt \) # 9. 只当前目录一层30天以上.log文件安全删除 find . -maxdepth 1 -type f -mtime 30 -name *.log -delete管道场景下print0 和 xargs -0 成对出现专治文件名空格特殊字符。八、易混淆对比find vs locatefind实时扫描磁盘准确、速度慢无数据库locate读取预生成数据库updatedb速度快数据非实时find -exec VS xargs-exec {} \;每条文件新建进程性能差文件名空格天然兼容-exec {} /xargs批量传参性能高空格文件名需要-print0/-0-atime /-mtime/-ctime 快速区分修改内容→ mtime修改权限、归属、改名、移动→ ctime读取打开文件→ atime易失效九、常见坑总结通配符不加引号shell 抢先展开导致异常()不转义、缺少空格-maxdepth必须放在路径之后、条件之前使用-delete前务必先执行不带 delete 查看列表文件名带空格、换行时优先-print0 xargs -0-prune使用时不要忘记末尾-o -print否则不会输出匹配项。Linux 打包 / 压缩 分级知识 实操手册前置基础概念必懂前提打包将多个文件 / 目录合并为单个归档文件不改变体积核心工具为tar产物后缀为.tar压缩通过算法缩小单个文件的体积无法直接处理目录常见工具为gzip/bzip2/xz日常最常见的.tar.gz是「tar 打包 gzip 压缩」的组合产物也是 Linux 环境的通用标准格式实操前置准备所有实操通用测试环境先执行以下命令创建统一的测试素材后续所有操作均可直接复用# 1. 创建测试项目目录与子目录 mkdir -p test_project/src test_project/docs # 2. 创建测试文件并写入内容 echo 项目主程序 test_project/src/main.py echo 说明文档 test_project/docs/README.md echo 配置文件 test_project/config.ini # 3. 查看目录结构确认创建成功 ls -R test_project 核心重点日常 90% 场景必掌握1. tar 核心必记参数必选核心参数二选一 必带 - f-c创建新的打包文件打包 / 压缩时使用-x提取文件解包 / 解压时使用-f指定操作的文件名必须放在所有参数的最后紧跟目标文件名常用辅助参数-v显示操作的详细过程新手建议添加可选-C指定解压输出的目标目录-z启用 gzip 压缩对应.tar.gz格式最常用参数作用-zgzip 算法对应.tar.gz-xextract解压-vverbose打印解压文件清单可选-f project.tar.gz指定压缩包文件-C /tmp/my_project✅重点切换目录将文件解压到/tmp/my_project2. .tar.gz 格式操作全场景最通用这是 Linux 环境最主流的压缩格式日常传文件、装软件基本都会遇到。打包压缩tar -zcvf 输出文件名.tar.gz 要打包的文件/目录默认解压tar -zxvf 压缩包名.tar.gz新版 tar 可省略-z自动识别格式指定目录解压tar -zxvf 压缩包名.tar.gz -C 目标目录路径【实操tar.gz 打包解压全流程】步骤 1打包压缩整个项目目录tar -zcvf project.tar.gz test_project/ # 执行后会打印打包的文件列表当前目录生成 project.tar.gz ls -lh project.tar.gz # 查看生成的压缩包大小步骤 2不解压仅查看压缩包内的文件列表tar -tvf project.tar.gz # 输出包含文件权限、大小、路径可确认打包是否完整步骤 3默认解压到当前目录# 先删除原测试目录验证解压效果 rm -rf test_project tar -xvf project.tar.gz # 新版tar自动识别gz格式可省略-z ls -R test_project # 验证文件是否完整解压步骤 4解压到指定目录# 先创建目标目录 mkdir -p /tmp/my_project tar -zxvf project.tar.gz -C /tmp/my_project ls -R /tmp/my_project # 验证解压结果3. .zip 格式操作跨平台通用zip 自带打包 压缩能力无需搭配 tar是 Windows/Linux 跨平台传输的首选格式。压缩打包zip -r 输出文件名.zip 要压缩的文件/目录压缩目录必须加-r递归直接解压unzip 压缩包名.zip指定目录解压unzip 压缩包名.zip -d 目标目录路径【实操zip 跨平台压缩解压】若系统提示无 zip/unzip 命令先执行安装 CentOSyum install -y zip unzipUbuntu/Debianapt install -y zip unzip步骤 1递归压缩目录为 zip 包zip -r project.zip test_project/ ls -lh project.zip步骤 2查看 zip 包内的文件列表unzip -l project.zip步骤 3解压到指定目录mkdir -p /tmp/zip_test unzip project.zip -d /tmp/zip_test ls -R /tmp/zip_test 次重点特定场景按需掌握1. 其他 tar 组合压缩格式操作逻辑和.tar.gz完全一致仅替换压缩参数即可对应不同的压缩算法。表格格式后缀压缩参数特点说明解压命令.tar.bz2-j压缩率比 gz 高速度偏慢tar -jxvf 文件名.tar.bz2.tar.xz-J压缩率极高速度最慢软件包常见tar -Jxvf 文件名.tar.xz.tar.zst--zstd新一代格式速度快 压缩率优tar --zstd -xvf 文件名.tar.zst【实操不同压缩格式效果对比】用同一个测试目录分别打包直观感受压缩率差异# 1. bz2格式打包 tar -jcvf project.tar.bz2 test_project/ # 2. xz格式打包 tar -Jcvf project.tar.xz test_project/ # 3. 对比三个压缩包的大小压缩率排序xz bz2 gz ls -lh project.tar.*所有 tar 系列压缩包都可以用通用解压命令tar -xvf 压缩包名新版 tar 会自动识别格式。2. 纯 tar 无压缩打包 / 解包仅合并文件不压缩多用于文件归档、整包快速传输。打包tar -cvf 归档名.tar 目标文件/目录解包tar -xvf 归档名.tar【实操纯 tar 归档操作】# 仅打包归档不做压缩 tar -cvf project.tar test_project/ # 解包到当前目录 tar -xvf project.tar3. 高频辅助操作查看压缩包内容不解压tar 系列用tar -tvf 压缩包名zip 格式用unzip -l 压缩包名.zip仅解压包内单个 / 指定文件tar -zxvf 压缩包名 包内文件路径【实操仅解压包内单个指定文件】以 tar.gz 包为例只解压单个配置文件不解压全部内容# 先确认包内的文件路径 tar -tvf project.tar.gz # 仅解压 src/main.py 单个文件 tar -zxvf project.tar.gz test_project/src/main.py # 查看解压结果 ls test_project/src/4. 单文件压缩工具 gzip/gunzip仅能处理单个文件无法直接压缩目录默认压缩后替换原文件。压缩gzip 文件名→ 生成文件名.gz解压gunzip 文件名.gz保留原文件压缩gzip -c 文件名 文件名.gz【实操单个文件压缩解压】# 1. 压缩单个文件原文件会被替换为.gz后缀 gzip test_project/config.ini ls test_project/ # 原config.ini消失出现config.ini.gz # 2. 解压单个文件 gunzip test_project/config.ini.gz ls test_project/ # 恢复原文件 补充拓展低频进阶了解即可1. 7z 高压缩率格式压缩7z a 输出文件名.7z 目标文件/目录解压7z x 压缩包名.7z【实操7z 格式压缩解压】需先安装工具CentOSyum install -y p7zipUbuntuapt install -y p7zip-full# 压缩目录 7z a project.7z test_project/ # 解压到当前目录 7z x project.7z2. tar 排除打包打包时跳过指定的文件或目录适合过滤临时文件、日志等无用内容。【实操打包时排除指定文件 / 目录】打包时排除 docs 目录和所有 ini 配置文件tar -zcvf project_no_doc.tar.gz test_project/ --excludetest_project/docs --exclude*.ini # 查看包内容确认排除规则生效 tar -tvf project_no_doc.tar.gz3. 追加文件到纯 tar 包仅支持无压缩的.tar格式已压缩的 tar.gz 等包无法直接追加文件。# 创建一个新文件 echo 新增文件 new.txt # 追加到已有的tar包 tar -rvf project.tar new.txt # 查看包内容确认文件已追加 tar -tvf project.tar常见易错点提醒-f参数必须放在参数列表最后紧跟文件名错误写法tar -cfvz test.tar.gz dirgzip/bzip2/xz 仅能处理单个文件无法直接压缩目录必须搭配 tar 使用zip 压缩目录必须加-r递归参数否则只会打包空目录不会包含内部文件