tulip notes
首页
  • 学习笔记

    • 《Vue》
  • 踩坑日记

    • JavaScript
  • MQ
  • Nginx
  • IdentityServer
  • Redis
  • Linux
  • Java
  • SpringBoot
  • SpringCloud
  • MySql
  • docker
  • 算法与设计模式
  • 踩坑与提升
  • Git
  • GitHub技巧
  • Mac
  • 网络
  • 项目构建合集
  • 一些技巧
  • 面试
  • 一些杂货
  • 友情链接
  • 项目发布
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Star-Lord

希望一天成为大师的学徒
首页
  • 学习笔记

    • 《Vue》
  • 踩坑日记

    • JavaScript
  • MQ
  • Nginx
  • IdentityServer
  • Redis
  • Linux
  • Java
  • SpringBoot
  • SpringCloud
  • MySql
  • docker
  • 算法与设计模式
  • 踩坑与提升
  • Git
  • GitHub技巧
  • Mac
  • 网络
  • 项目构建合集
  • 一些技巧
  • 面试
  • 一些杂货
  • 友情链接
  • 项目发布
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 各种MQ

  • Nginx

  • IdentityServer

  • Redis

  • Linux

    • Linux简介
    • Linux中一些常用命令
    • Linux中的文件复制与查找
    • 初识shell
    • shell-续与查看文件内容
    • 查看进程与shell
    • 查找数据与压缩
      • 内容查找
        • 搜索工具grep
        • grep的更多参数
      • 文件打包与压缩
        • 压缩
        • 小结
        • 打包
    • 再探shell
    • Linux系统中各个文件的作用
    • 【开发常用】Java开发必看
    • 【开发常用】软件安装利器
  • 中间件
  • Linux
EffectTang
2024-06-29
目录

查找数据与压缩

# 查找数据与压缩

之前的文章中,我们介绍了查看文件内容的一些方式,不知你是否还记得。

# 内容查找

cat,more,less,head,tail,它们各自的特点是什么?回想不起来,那就再回去看下,俗话说“重复形成记忆”。它们都是按照某种顺序来查看内容,顺序或者倒序。如果我们想看中间的一部分,有什么办法可以直接跳到中间吗?命令grep就是为了解决该问题而设计的。

# 搜索工具grep

grep(是global search regular expression and print out the line的缩写)它会在输入或指定的文件中查找,判断是否有我们想要的指定内容,如果有则就把对应的行内容给显示出来并高亮指定内容。它在工作中是很常用的一个命令。

语法:grep 参数 目标内容 文件名

# grep 参数 目标内容 文件名
 grep -n hell /home/hello.txt 
3:hello world
# 我想要看 hello.txt中有没有 hello
# 输出:找到hello 并输出所在列的全部内容  
1
2
3
4
5

其中参数-n,是用于显示行号的。

工作或者学习中查找某个内容,这个操作实在是太重要且常见了,所以开发者也为它设计了很多功能(提供了很多参数)用于满足我们的工作和学习,下面就介绍其中几个:

# grep的更多参数

如果想要知道有多少行匹配的指定内容,可用-c:

grep -c you /home/hello.txt
2
# 注意:只有2行,并不代表只有2处内容,仍可能有多处匹配上,因为一行可以有多处
grep -n you /home/hello.txt
5:power makes yourself stronger
6:you must trust yourself
1
2
3
4
5
6

当然,grep也支持正则表达式:

grep -n ^you /home/hello.txt
6:you must trust yourself
# 搜索指定文件中以某个关键词开头的内容行
# 因为只有第6行才是you开头的 所以只有一行
1
2
3
4

如果要匹配多个内容,还可以用-e参数来实现:

grep -e you -e must /home/hello.txt 
power makes yourself stronger
you must trust yourself
1
2
3

这样就实现了同时寻找you和must两种字符串了。

# 文件打包与压缩

还有一种操作或者说是两种,我们常会用到——打包和压缩。

打包:将多个文件或目录集合到一起成为一个单一的文件,这个过程不会减少文件的总大小,而是为了方便管理和传输。打包后的文件通常称为归档文件。就类似快递过程中的,我们通常会把一些细小的东西装到一个大箱子中再进行运送。在Linux系统中,用tar命令进行打包。

压缩:通过特殊编码方式降低了文件中的重复度和冗余度,从而减小文件大小,对文件压缩后会生成新的文件。因为对文件进行了新的编码,因此压缩后,会生成与原文件不同类型的文件(后缀名不同)。当然,因为采用的特殊编码(压缩算法)可能有多种,所以如果我们采用不同的压缩方式,得到的压缩文件也会不同。如:zip、gzip、bzip2等。linxu中压缩命令有多个,常用的有zip、gzip、bzip、xz等。

它们两个的作用是巨大的,不仅方便了文件的管理,还加速了网络传输效率,提高了备份效率,因为压缩文件通常比原文件体积更小。

# 压缩

压缩是通过特定的算法处理文件,减少文件的大小,以便于节省存储空间或加快文件在网络上的传输速度。linxu中常用的压缩工具包括gzip、bzip2、xz、zip等,生成如.gz、.bz2、.xz、zip等格式的文件。

zip工具对应的语法为:参数 目标文件名.zip 源文件或目录名

 zip archive.zip hello.txt 
  adding: hello.txt (deflated 33%)
# 或者你也可以压缩目录 通过参数 -r
zip -r ss.zip tmp/
  adding: tmp/ (stored 0%)
  adding: tmp/archive.zip (stored 0%)
  adding: tmp/h.txt (deflated 33%)
  adding: tmp/hello.txt (deflated 33%)
1
2
3
4
5
6
7
8

zip对应的解压指令也很简单,unzip

# unzip 参数 压缩包名
unzip archive.zip 
Archive:  archive.zip
  inflating: hello.txt              
1
2
3
4

当然它可选参数也有很多,比如:-d,解压到指定目录。-n,解压时不得覆盖已有文件。其余的这里就不一一展示了。

注意:对于一些小文件,可能存在压缩后的文件比原文件还要大的情况。这主要是因为压缩文件头开销的缘故。每个压缩文件都会有一个文件头,用于存储关于压缩文件的信息,如压缩方式、时间戳等。对于非常小的文件,这个开销可能会导致压缩后的文件比原文件大。

gzip也是常用的工具,它的语法为:gzip 参数 文件名

但有一点需要注意的是,gzip在压缩文件时,会在原文件名基础上自动添加.gz扩展名。例如,压缩example.txt文件后,会自动创建一个名为example.txt.gz的压缩文件,并且原文件会被删除。如果想要保留原文件,可使用参数-k。

ls
# 以下是输出 archive.zip  hello.txt  ss.txt
gzip ss.txt
ls
# 压缩ss文本后的文件 archive.zip  hello.txt  ss.txt.gz
# 当然gzip 也支持多个文件
1
2
3
4
5
6

关于同时压缩多个文件,gzip 命令是不支持的。如果你需要压缩多个文件,通常的做法是先使用 tar 命令将这些文件打包成一个单一的归档文件,然后再用 gzip 压缩这个归档文件。

# 解压 仍使用gzip 但要加上参数 -d
gzip -d ss.txt.gz
ls
# 压缩ss文本后的文件 archive.zip  hello.txt  ss.txt
# 或者使用gunzip 也是可以进行解压的 效果相同
gunzip ss.txt.gz
1
2
3
4
5
6

解压后,压缩包默认情况下也会被删除,如果想要保留压缩包,在解压前可先复制一个。

bzip2的语法跟gzip相同这里就不展开了,只不过使用bzip2压缩后的文件,后缀为bz2。

bzip2 ss.txt
# 效果 删除ss.txt,生成新的压缩文件 ss.txt.bz2
bzip2 -d ss.txt.bz2
# 解压
1
2
3
4

xz的用法也类似,

xz ss.txt 
# ls
# archive.zip  hello.txt  ss.txt.xz
xz -d ss.txt.xz 
# ls
# archive.zip  hello.txt  ss.txt
1
2
3
4
5
6

# 小结

xz, gzip, 和 bzip2 它们不直接支持将多个文件或目录打包成一个单独的压缩文件。但是,它们通常与 tar 命令结合使用,以实现对多个文件和目录的打包与压缩。例如,您可以先使用 tar 打包文件和目录,然后再用 xz, gzip, 或 bzip2 进行压缩。

但,zip 命令可以直接处理多个文件和目录,不仅能够打包还可以直接压缩成一个 .zip 文件,无需先使用其他打包工具。它支持的选项 -r 允许递归压缩目录,因此 zip 在处理多文件和目录时更为直接和方便。

从对文件大小压缩的效果来说,xz是最强的,但速度就相对耗时长一些。

# 打包

之前已经介绍过了,它是管理文件的一种手段,让对应的文件集合在一起。但实际工作中,它并不单独使用,而是常常与gzip、bzip2、xz等配合使用,进行打包和压缩。

  • 打包命令: tar -cvf 打包文件名.tar 文件或目录列表
  • 解打包命令: tar -xvf 打包文件名.tar
  • 与gzip结合压缩: tar -czvf 打包文件名.tar.gz 文件或目录列表
  • 与bzip2结合压缩: tar -cjvf 打包文件名.tar.bz2 文件或目录列表
  • 与xz结合压缩: tar -cJvf 打包文件名.tar.xz 文件或目录列表

语法格式:tar 参数 压缩包名 文件或目录名

tar -czvf hello.tar.gz hello.txt ss.txt 
# 以下2行是输出
hello.txt
ss.txt
# ls
# hello.tar.gz  hello.txt  ss.txt
1
2
3
4
5
6

以下是各个参数的对应解释:

  • -c 表示创建一个新的归档文件。
  • -z 表示在打包后使用 gzip 程序进行压缩。
  • -v 表示在处理文件时显示详细的处理信息,即 verbose 模式。
  • -f 后面跟的是归档文件的名称,这里是 hello.tar.gz

各个解压命令(只需要将参数 c 替换成 x即可):

 tar -xzvf hello.tar.gz 
 # 以下2行 是输出,因为使用了参数 v
hello.txt
ss.txt
# ls
# hello.tar.gz  hello.txt  ss.txt

1
2
3
4
5
6
7

windows中使用WinRAR或其他压缩软件将多个文件压缩成单个RAR文件(或者其他格式),这一过程确实类似于Linux中先打包后压缩的两个操作,但实际上是合二为一的一步完成。

上次更新: 2025/04/23, 16:23:16
查看进程与shell
再探shell

← 查看进程与shell 再探shell→

最近更新
01
面向切面跟自定义注解的结合
05-22
02
时间跟其他数据的序列化
05-19
03
数据加密与安全
05-17
更多文章>
Theme by Vdoing | Copyright © 2023-2025 EffectTang
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式