在 Linux Ubuntu 中,关于这些版本的“tar”命令:
tar -tzf /path/to/filename.tar.gz # Show the content
tar -xzf /path/to/filename.tar.gz # Extract the content
观察这两个命令都使用该z
选项,并且它们按预期工作。
通过man tar
,关于该z
选项,表明:
-z, --gzip, --gunzip, --ungzip
Filter the archive through gzip(1).
问题
- 为什么
tar
命令gzip
通过'z'
选项使用命令?
额外问题
关于Filter the archive through gzip(1).
部分。
"filter"
为什么上面显示的两个命令中需要它?或 的含义或上下文是什么filter
?
答案1
归档和压缩是两个不同的事情。
Windows 上的大多数归档程序(例如zip
,7z
、rar
、 等等)将两者合并为一个程序,既进行归档又进行压缩 - 因此习惯使用 Windows 的人往往认为它们是一件不可分割的事情。
虽然许多此类程序存在于 UNIX/Linux 上,主要是为了与非 UNIX 系统兼容,但更常见的是由单独的程序来完成压缩和归档功能。与 MS-DOS/Windows 归档程序不同,unix 本机程序理解并利用 unix 文件元数据(例如所有权和权限),有些甚至可以正确处理 ACL。
tar
是一个归档程序。它允许将一个或多个文件存储在 .tar 存档中。该存档未压缩。它最初用于将包含多个文件和相关元数据(文件名、所有权、权限等)的流写入磁带。或者到文件,因为任何字节流都可以重定向到文件或通过管道传输到另一个程序。 tar
不是唯一的存档程序,还有许多其他程序,包括cpio
、ar
、afio
、pax
等等。
gzip
是一个压缩程序。它可以将任何单个文件压缩为其自身的压缩版本。或者它可以压缩来自标准输入的数据并将其输出到标准输出(即它可以充当“过滤器”)。同样,gzip
这不是唯一的压缩/解压缩程序,它是众多程序之一。
tar
可用于gzip
在将 .tar 存档写入磁盘之前对其进行压缩。并在读取压缩档案之前对其进行解压缩。
根据tar
您所使用的版本,它可能能够使用其他压缩程序来代替gzip
.例如,GNU tar 有以下与压缩相关的选项:
压缩选项
-a
,--auto-compress
使用压缩包后缀来确定压缩程序。
-I
,--use-compress-program=COMMAND
通过COMMAND过滤数据。它必须接受该-d
选项才能解压。参数可以包含命令行选项。
-j
,--bzip2
通过 bzip2(1) 过滤存档。
-J
,--xz
通过xz(1)过滤存档。
--lzip
通过 lzip(1) 过滤存档。
--lzma
通过 lzma(1) 过滤存档。
--lzop
通过 lzop(1) 过滤存档。
--no-auto-compress
不要使用存档后缀来确定压缩程序。
-z
,--gzip
,--gunzip
,--ungzip
通过 gzip(1) 过滤存档。
-Z
,--compress
,--uncompress
通过 compress(1) 过滤存档。
--zstd
通过 zstd(1) 过滤存档。
而且,值得注意的是,其他归档程序也可以与压缩程序一起使用 - 通过命令行选项,如-z
或-Z
等;或者在将压缩器的输出重定向到文件之前将归档器的输出通过管道传输到压缩程序中(或者相反,将解压缩程序的输出通过管道传输到归档器中以列出或提取其内容)
您可以根据需要“混合搭配”归档和压缩程序,从而使您能够利用归档和/或压缩技术的改进。
大多数归档程序,包括 GNU tar,通过管道支持这一点,但 GNU tar 还为一些知名程序提供了几个内置选项,并且-I
为使用没有自己内置选项的其他压缩程序提供了一个方便的选项 - 也许实现新的压缩算法或现有算法的新实现。例如,诸如pigz
、pixz
等程序pbzip2
(而不是gzip
、xz
、bzip2
等)是这些压缩程序的并行版本,可以利用多核/多线程 CPU 来大大减少压缩或解压缩数据所需的时间。
“过滤器”是管道中使用的程序的通用术语,用于在将一个程序的输出重定向到文件或通过管道传输到管道中的下一个程序之前处理(并可能以某种方式修改)一个程序的输出。
某些程序(例如tar
with-z
等)可以自行设置过滤管道,而不需要用户在 shell 中执行此操作(例如,tar xfz filename.tar.gz
与 基本相同gzip -d filename.tar.gz | tar xf -
,并且tar cfz filename.tar.gz ...
与 本质上相同tar cf - ... | gzip > filename.tar.gz
)
许多unix程序都是这样编写的,以便它们可以用作管道中的过滤器 - 例如gzip
可以压缩现有文件,也可以压缩其输入流(stdin)并将输出发送到stdout......以及一个简单的程序,例如cat
可以只需将其 stdin 直接传递到 stdout 或可选地对行进行编号(使用-n
),使行尾和控制及其他代码可见(使用-v
, -E
, -A
,等选项-t
)。
顺便说一句,因为管道非常有用,所以人们编写自己的脚本(用 awk 或 perl 或其他语言)是很常见的,这样他们就能够从 stdin 获取输入并写入 stdout - 即人们通常编写自己的脚本自己的过滤器。