Tar

為什麼 tar 命令通過 ‘z’ 選項使用 gzip 命令?

  • October 31, 2022

在 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什麼?

歸檔和壓縮是兩個不同的東西。

Windows 上的大多數歸檔程序(例如zip7zrar等)將兩者組合成一個程序,既可以進行歸檔又可以進行壓縮 - 因此習慣使用 Windows 的人傾向於認為它們只是不可分割的一件事。

雖然這些程序中有許多存在於 unix/linux 上,主要是為了與非 unix 系統兼容,但壓縮和歸檔功能由單獨的程序完成更為常見。與 MS-DOS/Windows 歸檔程序不同,unix-native 程序理解並使用 unix 文件元數據,如所有權和權限,有些程序甚至可以正確處理 ACL。

tar是一個歸檔程序。它允許將一個或多個文件儲存在 .tar 存檔中。此存檔未壓縮。它最初用於將包含多個文件和相關元數據(文件名、所有權、權限等)的流寫入磁帶。或者到文件,因為任何字節流都可以重定向到文件或通過管道傳輸到另一個程序。 tar不是唯一的歸檔程序,還有許多其他程序,包括cpioarafiopax等等。

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) 過濾存檔。

而且,值得注意的是,其他歸檔程序也可以與壓縮程序一起使用——通過命令行選項,如-zor-Z等​​;或者通過在將壓縮器的輸出重定向到文件之前將存檔器的輸出通過管道傳輸到壓縮程序中(或者相反,將解壓縮程序的輸出通過管道傳輸到存檔器以列出或提取其內容)

您可以根據需要“混合和匹配”歸檔和壓縮程序,從而使您能夠利用歸檔和/或壓縮技術的改進。

大多數存檔器,包括 GNU tar,都通過管道支持這一點,但 GNU tar 還為一些知名程序提供了幾個內置選項,並且-I為使用沒有自己的內置選項的其他壓縮程序提供了一個方便的選項——也許實現新的壓縮算法或現有算法的新實現。例如,像pigz,pixzpbzip2(而不是gzip, xz,bzip2等)這樣的程序是這些壓縮程序的並行版本,可以利用多核/多執行緒 CPU 來大大減少壓縮或解壓縮數據所需的時間。


“過濾器”是管道中使用的程序的通用術語,用於處理(並可能以某種方式修改)一個程序的輸出,然後將其重定向到文件或將其傳送到管道中的下一個程序。

一些程序(如tarwith-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只需將其標準輸入直接傳遞給標準輸出或可選地對行進行編號(使用-n),使行尾和控制以及其他程式碼可見(使用-v, -E, -A,等選項-t)。

順便說一句,因為管道非常有用,人們編寫自己的腳本(在 awk 或 perl 或其他)非常普遍,以便他們能夠從標準輸入獲取輸入並寫入標準輸出 - 即人們編寫他們的腳本很常見自己的過濾器。

引用自:https://unix.stackexchange.com/questions/722967