摘要:在本文中,您將學習與tar 命令一起使用的最常用標誌、如何建立和提取 tar 存檔以及如何建立和提取 gzip 壓縮的 tar 存檔。
本文分享自華為雲社群《Linux 中的 Tar 命令:壓縮和提取檔案,學會了嗎》,作者:Tiamo_T 。
Linux tar 命令如何工作?
tar 命令用於建立 .tar、.tar.gz、.tgz 或 tar.bz2 檔案,通常稱為“tarball”。副檔名 .tar.gz 和 .tgz 用於識別使用 gzip 壓縮生成的檔案,以減少檔案的大小。 副檔名為 .tar.bz2 的檔案是使用 bzip2 壓縮生成的。
Linux 發行版提供 tar 二進位制檔案,無需外部命令的幫助即可支援 gzip 壓縮。正如我們將在本文中看到的那樣,這可能不適用於其他型別的壓縮。
讓我們從tar命令的三個示例開始,以熟悉最常見的標誌。
建立一個包含兩個檔案的存檔
這是 tar 命令的基本示例,在這種情況下我們不使用壓縮:
tar -cf archive.tar testfile1 testfile2
此命令建立一個名為 archive.tar 的存檔檔案,其中包含兩個檔案:testfile1 和 testfile2。
這是兩個標誌的含義:
- -c(與-create 相同):建立一個新存檔
- -f:它允許指定一個存檔檔案(在這種情況下稱為archive.tar)
file 命令確認 archive.tar 是一個存檔:
[myuser@localhost]$ file archive.tar
archive.tar: POSIX tar archive (GNU)
另一個有用的標誌是-v標誌,它提供在 Linux 上執行tar命令期間處理的檔案的詳細輸出。
如果我們在建立存檔時也傳遞 -v 標誌,讓我們看看輸出如何變化:
[myuser@localhost]$ tar -cfv archive.tar testfile1 testfile2
tar: archive.tar: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
奇怪,由於某種原因,我們得到了一個錯誤……
這是因為 tar 命令根據 -f 標誌後面的內容建立了一個具有名稱的存檔,在這種情況下,在 -f 標誌之後是v。
結果是一個名為 v 的存檔,您可以從下面的 ls 輸出中看到:
[myuser@localhost]$ ls -al total 20 drwxrwxr-x. 2 myuser mygroup 4096 Jul 17 09:42 . drwxrwxrwt. 6 root root 4096 Jul 17 09:38 .. -rw-rw-r--. 1 myuser mygroup 0 Jul 17 09:38 testfile1 -rw-rw-r--. 1 myuser mygroup 0 Jul 17 09:38 testfile2 -rw-rw-r--. 1 myuser mygroup 10240 Jul 17 09:42 v [myuser@localhost]$ file v v: POSIX tar archive (GNU)
“沒有這樣的檔案或目錄”目錄是由於 tar 試圖建立一個名為 v 的存檔,其中包含三個檔案:archive.tar、testfile1 和 testfile2。
但是 archive.tar 不存在,因此出現錯誤。
這表明 tar 的標誌順序是多麼重要。
讓我們交換 tar 命令中的 -f 和 -v 標誌並重試:
[myuser@localhost]$ tar -cvf archive.tar testfile1 testfile2
testfile1
testfile2
這次一切順利,詳細標誌顯示了新增到我們正在建立的存檔中的兩個檔案的名稱。
說得通?
詳細列出 tar 存檔中的所有檔案
要列出 tar 存檔中的所有檔案而不提取其內容,我們將引入第四個標誌:
-t : 列出檔案的內容
我們現在可以將三個標誌放在一起:-t、-v和-f來檢視我們之前建立的存檔中的檔案:
[myuser@localhost]$ tar -tvf archive.tar -rw-rw-r-- myuser/mygroup 0 2020-07-17 09:38 testfile1 -rw-rw-r-- myuser/mygroup 0 2020-07-17 09:38 testfile2
我應該將 Dash 與 Tar 一起使用嗎?
我注意到在某些情況下出現標誌之前的破折號,但情況並非總是如此。
所以,讓我們看看是否通過破折號有什麼不同。
首先,讓我們嘗試在不使用標誌前的破折號的情況下執行相同的命令:
[myuser@localhost]$ tar tvf archive.tar -rw-rw-r-- myuser/mygroup 0 2020-07-17 09:38 testfile1 -rw-rw-r-- myuser/mygroup 0 2020-07-17 09:38 testfile2
輸出是相同的,這意味著不需要破折號。
只是給您一個想法,您可以按以下方式執行 tar 命令並獲得相同的輸出:
tar -t -v -f archive.tar tar -tvf archive.tar tar -tvf archive.tar tar --list --verbose --file archive.tar
最後一個命令使用長選項樣式作為提供給 Linux 命令的標誌。
您可以看到使用標誌的簡短版本要容易得多。
從存檔中提取所有檔案
讓我們引入一個額外的標誌,允許提取 tar 存檔的內容。這是-x標誌。
要提取我們之前建立的檔案的內容,我們可以使用以下命令:
tar -xvf archive.tar (the two lines below are the output of the command in the shell) testfile1 testfile2 ls -al total 20 drwxrwxr-x 2 myuser mygroup 59 Feb 10 21:21 . drwxr-xr-x 3 myuser mygroup 55 Feb 10 21:21 .. -rw-rw-r-- 1 myuser mygroup 10240 Feb 10 21:17 archive.tar -rw-rw-r-- 1 myuser mygroup 54 Feb 10 21:17 testfile1 -rw-rw-r-- 1 myuser mygroup 78 Feb 10 21:17 testfile2
正如您所看到的,我們使用-x標誌來提取檔案的內容,使用-v標誌來詳細提取,使用-f標誌來引用在標誌之後指定的檔案檔案 (archive.tar)。
注意:如前所述,我們只在所有標誌之前輸入一次破折號字元。我們可以在每個標誌之前指定破折號,而輸出將是相同的。
tar -x -v -f archive.tar
還有一種方法可以從存檔中提取單個檔案。
在這種情況下,考慮到我們的存檔中只有兩個檔案,這並沒有太大區別。但是,如果您有一個包含數千個檔案的存檔並且您只需要其中一個,那麼它會產生巨大的差異。
如果您有一個備份指令碼來建立過去 30 天的日誌檔案存檔,並且您只想檢視特定日期的日誌檔案的內容,那麼這很常見。
要僅從 archive.tar 中提取 testfile1,您可以使用以下通用語法:
tar -xvf {archive_file} {path_to_file_to_extract}
在我們的具體案例中:
tar -xvf archive.tar testfile1
讓我們看看如果我建立一個包含兩個目錄的 tar 存檔會發生什麼變化:
[myuser@localhost]$ ls -ltr total 8 drwxrwxr-x. 2 myuser mygroup 4096 Jul 17 10:34 dir1 drwxrwxr-x. 2 myuser mygroup 4096 Jul 17 10:34 dir2 [myuser@localhost]$ tar -cvf archive.tar dir* dir1/ dir1/testfile1 dir2/ dir2/testfile2
注意:請注意,我使用萬用字元 * 將名稱以“dir”開頭的任何檔案或目錄包含在存檔中。
如果我只想提取 testfile1 命令將是:
tar -xvf archive.tar dir1/testfile1
解壓後保留了原來的目錄結構,所以我將在dir1中得到testfile1:
[myuser@localhost]$ ls -al dir1/ total 8 drwxrwxr-x. 2 myuser mygroup 4096 Jul 17 10:36 . drwxrwxr-x. 3 myuser mygroup 4096 Jul 17 10:36 .. -rw-rw-r--. 1 myuser mygroup 0 Jul 17 10:34 testfile1
一切都清楚了嗎?
減少 tar 檔案的大小
Gzip和Bzip2壓縮可用於減小 tar 存檔的大小。
啟用壓縮的其他 tar 標誌是:
- -z用於 Gzip 壓縮:長標誌是–gzip
- -j用於 Bzip2 壓縮:長標誌為–bzip2
要使用詳細輸出建立名為 archive.tar.gz 的 gzipped tar 存檔,我們將使用以下命令(也是建立 tar 存檔時最常用的命令之一):
tar -czvf archive.tar.gz testfile1 testfile2
並提取其內容,我們將使用:
tar -xzvf archive.tar.gz
我們也可以使用 .tgz 副檔名而不是 .tar.gz,結果是一樣的。
現在,讓我們建立一個使用 bzip2 壓縮的存檔:
[myuser@localhost]$ tar -cvjf archive.tar.bz2 testfile* testfile1 testfile2 /bin/sh: bzip2: command not found tar: Child returned status 127 tar: Error is not recoverable: exiting now
錯誤“bzip2: command not found”表明 tar 命令正在嘗試使用 bzip2 命令進行壓縮,但在我們的 Linux 系統上找不到該命令。
解決辦法是安裝bzip2。該過程取決於您使用的 Linux 發行版,在我的情況下是使用 yum 作為包管理器的 CentOS。
讓我們使用以下yum 命令安裝 bzip2 :
yum install bzip2
我可以使用 which 命令確認 bzip2 二進位制檔案存在:
[myuser@localhost]$ which bzip2
/usr/bin/bzip2
現在,如果我再次使用 bzip2 壓縮執行 tar 命令:
[myuser@localhost]$ tar -cvjf archive.tar.bz2 testfile* testfile1 testfile2 [myuser@localhost]$ ls -al total 16 drwxrwxr-x. 2 myuser mygroup 4096 Jul 17 10:45 . drwxrwxrwt. 6 root root 4096 Jul 17 10:53 .. -rw-rw-r--. 1 myuser mygroup 136 Jul 17 10:54 archive.tar.bz2 -rw-rw-r--. 1 myuser mygroup 128 Jul 17 10:45 archive.tar.gz -rw-rw-r--. 1 myuser mygroup 0 Jul 17 10:44 testfile1 -rw-rw-r--. 1 myuser mygroup 0 Jul 17 10:44 testfile2
一切正常!
另外,考慮到我很好奇,我想根據 Linux file 命令檢視兩個存檔(.tar.gz 和 .tar.bz2)之間的區別:
[myuser@localhost]$ file archive.tar.gz archive.tar.gz: gzip compressed data, last modified: Fri Jul 17 10:45:04 2020, from Unix, original size 10240 [myuser@localhost]$ file archive.tar.bz2 archive.tar.bz2: bzip2 compressed data, block size = 900k
如您所見,Linux 可以區分使用兩種不同壓縮演算法生成的檔案。
結論
在本文中,您學習了與tar 命令一起使用的最常用標誌、如何建立和提取 tar 存檔以及如何建立和提取 gzip 壓縮的 tar 存檔。
讓我們再次回顧一下所有的標誌:
- -c:建立一個新的存檔
- -f:允許指定存檔的檔名
- -t:列出檔案的內容
- -v:詳細列出已處理的檔案
- -x:從存檔中提取檔案
- -z:使用gzip壓縮
- -j:使用bzip2壓縮