文件查找find和打包压缩
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/*.py"2. 文件类型-type
-type f # 普通文件 -type d # 目录 directory -type l # 符号链接 link -type s # socket套接字 -type p # 管道文件 fifo -type b # 块设备 -type c # 字符设备运行
find . -type d -name "logs"3. 文件大小-size
单位:c字节 |kKB |MMB |GGB 前缀:+大于,-小于,无符号等于
find . -size +100M # 大于100MB find . -size -10k # 小于10KB find . -size 0c # 空文件4. 时间类参数(高频难点)
三种时间:
- -mtime:modify,文件内容修改时间(最常用)
- -ctime:change,文件元数据修改(权限、属主、文件名改动)
- -atime:access,文件被读取访问时间(很多系统挂载 noatime,不准确)
单位:天(24 小时)
plaintext
-mtime +7 # 修改时间 超过7天 -mtime -7 # 7天以内修改 -mtime 7 # 刚好第7~8天之间分钟版本-mmin / -cmin / -amin
运行
find . -mmin -60 # 一小时内改动文件扩展:对比参考时间-newer
find . -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 {} +
尽可能把多个文件一次性传给命令,减少进程创建,效率更高类似xargs
find . -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 locate
find:实时扫描磁盘,准确、速度慢;无数据库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格式,最常用)
| 参数 | 作用 |
|---|---|
-z | gzip 算法,对应.tar.gz |
-x | extract解压 |
-v | verbose,打印解压文件清单(可选) |
-f project.tar.gz | 指定压缩包文件 |
-C /tmp/my_project | ✅重点:切换目录,将文件解压到/tmp/my_project |
2. .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 命令,先执行安装: CentOS:
yum install -y zip unzipUbuntu/Debian:apt 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 格式压缩解压】
需先安装工具:CentOS
yum install -y p7zip,Ubuntuapt 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/ --exclude=test_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 dir- gzip/bzip2/xz 仅能处理单个文件,无法直接压缩目录,必须搭配 tar 使用
- zip 压缩目录必须加
-r递归参数,否则只会打包空目录,不会包含内部文件
