查找数据与压缩
# 查找数据与压缩
之前的文章中,我们介绍了查看文件内容的一些方式,不知你是否还记得。
# 内容查找
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 并输出所在列的全部内容
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
2
3
4
5
6
当然,grep也支持正则表达式:
grep -n ^you /home/hello.txt
6:you must trust yourself
# 搜索指定文件中以某个关键词开头的内容行
# 因为只有第6行才是you开头的 所以只有一行
2
3
4
如果要匹配多个内容,还可以用-e参数来实现:
grep -e you -e must /home/hello.txt
power makes yourself stronger
you must trust yourself
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%)
2
3
4
5
6
7
8
zip
对应的解压指令也很简单,unzip
# unzip 参数 压缩包名
unzip archive.zip
Archive: archive.zip
inflating: hello.txt
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 也支持多个文件
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
2
3
4
5
6
解压后,压缩包默认情况下也会被删除,如果想要保留压缩包,在解压前可先复制一个。
bzip2
的语法跟gzip
相同这里就不展开了,只不过使用bzip2压缩后的文件,后缀为bz2。
bzip2 ss.txt
# 效果 删除ss.txt,生成新的压缩文件 ss.txt.bz2
bzip2 -d ss.txt.bz2
# 解压
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
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
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
2
3
4
5
6
7
windows中使用WinRAR或其他压缩软件将多个文件压缩成单个RAR文件(或者其他格式),这一过程确实类似于Linux中先打包后压缩的两个操作,但实际上是合二为一的一步完成。