文件查找find和打包压缩

📅 2026/7/10 9:09:17 👁️ 阅读次数 📝 编程学习
文件查找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 -xdev

6. 文件属性

-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 +10M

shell 中()是特殊字符,必须写成\( \)

五、【动作 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 -ls

7.-fls file

-ls的输出写入指定文件

8.-printf "格式"自定义输出

常用格式符:

%p 文件完整路径 %f 仅文件名 %h 文件所在目录 %s 文件大小(bytes) %t 修改时间 %U 用户名 %G 组名

示例:只打印文件名

find . -type f -printf "%f\n"

六、find 执行逻辑(底层原理,很多人不懂)

find 按顺序遍历目录树,对每个文件依次执行表达式:

  1. 从左向右依次判断条件;
  2. 条件结果为true,继续向后;false 停止后续判断;
  3. 到达动作(-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

  1. find:实时扫描磁盘,准确、速度慢;无数据库
  2. locate:读取预生成数据库(updatedb),速度快,数据非实时

find -exec VS xargs

  1. -exec {} \;:每条文件新建进程,性能差;文件名空格天然兼容
  2. -exec {} +/xargs:批量传参,性能高;空格文件名需要-print0/-0

-atime /-mtime/-ctime 快速区分

  • 修改内容→ mtime
  • 修改权限、归属、改名、移动→ ctime
  • 读取打开文件→ atime(易失效)

九、常见坑总结

  1. 通配符不加引号,shell 抢先展开导致异常;
  2. ()不转义、缺少空格;
  3. -maxdepth必须放在路径之后、条件之前;
  4. 使用-delete前务必先执行不带 delete 查看列表;
  5. 文件名带空格、换行时,优先-print0 + xargs -0
  6. -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_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.tar

3. 高频辅助操作

  • 查看压缩包内容(不解压):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 p7zip,Ubuntuapt install -y p7zip-full

# 压缩目录 7z a project.7z test_project/ # 解压到当前目录 7z x project.7z

2. tar 排除打包

打包时跳过指定的文件或目录,适合过滤临时文件、日志等无用内容。

【实操:打包时排除指定文件 / 目录】

打包时排除 docs 目录和所有 ini 配置文件:

tar -zcvf project_no_doc.tar.gz test_project/ --exclude=test_project/docs --exclude=*.ini # 查看包内容,确认排除规则生效 tar -tvf project_no_doc.tar.gz

3. 追加文件到纯 tar 包

仅支持无压缩的.tar格式,已压缩的 tar.gz 等包无法直接追加文件。

# 创建一个新文件 echo "新增文件" > new.txt # 追加到已有的tar包 tar -rvf project.tar new.txt # 查看包内容,确认文件已追加 tar -tvf project.tar

常见易错点提醒

  1. -f参数必须放在参数列表最后,紧跟文件名,错误写法:tar -cfvz test.tar.gz dir
  2. gzip/bzip2/xz 仅能处理单个文件,无法直接压缩目录,必须搭配 tar 使用
  3. zip 压缩目录必须加-r递归参数,否则只会打包空目录,不会包含内部文件