Linux技巧:介紹 tar 命令打包、壓縮、和加解密的用法

Linux技巧:介紹 tar 命令打包、壓縮、和加解密的用法

在 Linux 中,可以使用 tar 命令把多個文件、目錄打包到指定的歸檔文件裡面。

要注意的是,tar 命令默認只是把多個文件打包放到一起,不會對文件進行壓縮,所以打包後的文件大小並不會變小,由於添加了一些 tar 格式的文件信息,甚至可能會變大。

如果想在 tar 命令中進行壓縮、或者解壓縮操作,需要提供對應的選項參數。後面會具體說明。

tar 命令格式

查看 man tar 對 tar 命令的格式說明如下:

tar [-] A --catenate --concatenate | c --create | d --diff --compare | --delete | r --append | t --list | --test-label | u --update | x --extract --get [options] [pathname ...]

Tar stores and extracts files from a tape or disk archive.

A function letter need not be prefixed with ``-'', and may be combined with other single-letter options. A long function name must be prefixed with --.

Some options take a parameter; with the single-letter form these must be given as separate arguments. With the long form, they may be given by appending =value to the option.

即,tar 命令可以在磁帶、或者磁盤上創建和提取歸檔文件。

提供 Acdrtux 這些選項時,選項前面可以不帶連字符 -。

當其他選項和這幾個功能選項寫在一起時,也可以不帶 - 字符。如果單獨提供其他選項,需要以 - 開頭。

對常用的功能選項說明如下:

  • -c, --create
    create a new archive.
    即,指定創建一個新的歸檔文件,而不是從歸檔文件中提取文件。
  • -r, --append
    append files to the end of an archive.
    即,往已有的歸檔文件中追加寫入新的文件。
  • -t, --list
    list the contents of an archive.
    即,不用解開歸檔文件,就能列出歸檔文件裡面打包的文件信息
  • -u, --update
    only append files newer than copy in archive
    即,當本地文件新于歸檔文件裡面的文件時,打包本地文件到歸檔文件裡面。
    這個選項不能更新被壓縮的歸檔文件。
  • -x, --extract, --get
    extract files from an archive.
    即,從歸檔文件中提取出文件

在這些功能選項中,沒有包含壓縮和解壓縮的選項。

一般來說,這些功能選項會再搭配下面的選項進行使用:

  • -f, --file ARCHIVE
    use archive file or device ARCHIVE.
    即,-f 選項要提供一個參數,指定歸檔文件名稱。
    如果沒有指定該選項,tar 命令一般會把內容寫到標準輸出。
  • -v, --verbose
    verbosely list files processed.
    即,打印操作過程的詳細信息。常用於查看提取的文件信息。

一些使用例子說明如下:

  • 創建歸檔文件
<code>$ tar 

c

java/ hello.

c

-f archive.tar $ ls archive.tar java hello.

c

/<code>

在 tar c java/ hello.c -f archive.tar 命令中,c java/ hello.c 指定對 java/ 目錄、hello.c 文件進行打包。-f archive.tar 指定打包生成的歸檔文件名是 archive.tar。

執行 tar 命令後,使用 ls 命令可以看到生成了 archive.tar 文件。

  • 列出歸檔文件裡面的文件信息
<code>$ tar tf archive.tar
java/
java/Service.java
hello.c
/<code>

可以看到,剛才打包生成的 archive.tar 裡面包含一個 java/ 目錄,一個 hello.c 文件,在 java/ 目錄裡面有一個 Service.java 文件。

  • 從歸檔文件中提取出文件
<code>$ tar xf archive.tar
$ tar xvf archive.tar
java/
java/Service.java
hello.c
/<code>

可以看到,tar xvf archive.tar 命令從 archive.tar 歸檔文件中提取文件到本地,使用 -v 選項列出提取的文件信息。

而 tar xf archive.tar 命令只提取文件到本地,沒有列出提取的文件信息。

指定壓縮和解壓縮

由於 tar 命令默認只打包,不壓縮,打包後的歸檔文件大小並不會變小。

如果想在打包時進行壓縮,需要指定其他選項。如果要解壓縮,也需要指定對應的選項。

下面這些選項用於指定使用什麼壓縮工具,指定的壓縮工具可用於壓縮、或者解壓縮。

  • -j, --bzip2
    使用 bzip2 命令進行壓縮或解壓縮
  • -z, --gzip, --gunzip --ungzip
    使用 gzip 命令進行壓縮或解壓縮
  • -Z, --compress, --uncompress
    使用 compress 命令進行壓縮或解壓縮
  • -a, --auto-compress
    use archive suffix to determine the compression program.
    即,根據歸檔文件的後綴名自動選擇壓縮命令。例如,.gz 後綴名使用 gzip 命令進行壓縮。

注意:這幾個選項用於指定使用什麼壓縮工具來進行壓縮、或者解壓縮,這些選項僅僅只是指定壓縮工具。具體是壓縮、還是解壓縮,可以由 -c 選項和 -x 選項來指定。

當這幾個選項搭配打包歸檔文件的選項一起使用時,會進行壓縮操作。

當這幾個選項搭配提取歸檔文件的選項一起使用時,會進行解壓縮操作。

所指定的壓縮工具是單獨的命令,需要系統已經安裝這些命令才能正常使用

使用 tar 進行壓縮的命令

下面是一些使用 tar 進行壓縮的命令。

  • 使用 gzip 進行壓縮
<code>

tar

czf archive.tar.gz java/ hello.c /<code>

在 tar czf archive.tar.gz java/ hello.c 命令中,-z 選項指定使用 gzip 命令進行操作。-c 選項指定創建歸檔文件,結合 -z 使用就是進行壓縮。-f 選項指定後面跟著的參數是歸檔文件名,也就是 archive.tar.gz。後面所給的 java/ hello.c 這幾個文件會被壓縮打包。

一般來說,使用 gzip 進行壓縮的文件,文件名會以 .gz 結尾。在 tar 命令中使用 gzip 進行壓縮,文件名會以 .tar.gz 結尾。但這並不是強制的。

在 Linux 裡面,文件名後綴名並不能決定文件的格式,這樣寫只是為了方便查看。

  • 使用 bzip2 進行壓縮
<code>

tar

cjf archive.tar.bz2 java/ hello.c /<code>

在這個命令中,-j 選項指定使用 bzip2 命令進行操作。

一般來說,使用 bzip2 進行壓縮的文件,文件名會以 .bz2 結尾。在 tar 命令中使用 bzip2 進行壓縮,文件名會以 .tar.bz2 結尾。

  • 使用 compress 進行壓縮
<code>

tar

cZf archive.tar.Z java/ hello.c /<code>

在這個命令中,-Z 選項指定使用 compress 命令進行操作。

如果當前系統沒有安裝 compress 命令會報錯。

一般來說,使用 compress 進行壓縮的文件,文件名會以 .Z 結尾。在 tar 命令中使用 bzip2 進行壓縮,文件名會以 .tar.Z 結尾。

  • 根據歸檔文件的後綴名自動使用對應命令進行壓縮
<code>

$

tar

caf

archive.tar.gz

java/

hello.c

$

file

archive.tar.gz

archive.tar.gz:

gzip

compressed

data,

from

Unix,

last modified:

Fri

Dec

6

14

:50:57

2019

$

tar

caf

archive.tar.bz2

java/

hello.c

$

file

archive.tar.bz2

archive.tar.bz2:

bzip2

compressed

data,

block

size

=

900k

/<code>

在 tar caf archive.tar.gz java/ hello.c 命令中,-a 選項指定根據歸檔文件後綴名自動選擇相應的命令。這裡提供的後綴名是 .gz,會使用 gzip 命令。

執行該命令後,使用 file archive.tar.gz 命令查看生成的文件格式,確實是 gzip 壓縮格式。

類似的,在 tar caf archive.tar.bz2 java/ hello.c 命令中,通過 -a 選項和 .bz2 後綴名指定用 bzip2 進行操作。

使用 tar 進行解壓縮的命令

在 tar 命令進行解壓縮,也是用到 -z、-f、-Z 選項。下面是一些使用 tar 進行解壓縮的命令。

  • 使用 gzip 進行解壓縮
<code>

tar

xzvf

archive

.tar

.gz

/<code>

在 tar xzf archive.tar.gz 命令中,-z 選項指定用 gzip 命令進行操作,-x 選項指定從歸檔文件提取文件,結合 -z 使用就是進行解壓縮。-f archive.tar.gz 指定對 archive.tar.gz 歸檔文件進行解壓縮,並提取文件到本地,該文件必須是用 gzip 格式的壓縮文件才能正確解壓縮。

這裡使用 -v 選項以便打印提取的文件。這個選項不是必須的。如果沒有添加該選項,解壓縮的時候,界面會沒有任何打印。

  • 使用 bzip2 進行解壓縮
<code>

tar

xjvf

archive

.tar

.bz2

/<code>

在這個命令中,-j 選項指定使用 bzip2 命令進行操作。

  • 使用 compress 進行解壓縮
<code>

tar

xZvf

archive

.tar

.Z

/<code>

在這個命令中,-Z 選項指定使用 compress 命令進行操作。

注意:對於某些沒有使用約定後綴名結尾的歸檔壓縮文件,可以使用 file 命令來確認它的格式,以便使用對應的選項來進行解壓縮。

結合 openssl 命令進行加密解密

對歸檔文件進行加密

在使用 tar 命令打包時,可以結合 openssl 命令使用,對生成的歸檔文件進行加密。具體命令如下:

<code>

tar

-czf - filename | openssl des3 -salt -k passwd | dd of=filename.des3 /<code>

在 tar -czf - filename 命令中,-zc 指定對所給的文件使用 gzip 進行壓縮。如果想用其他的壓縮命令,可以改用對應的選項。

-f - 表示把創建的歸檔文件寫入到標準輸出,tar 命令可以把 - 當成文件名,並進行一些特殊處理。後面會具體說明。而 filename 是被打包壓縮的文件名,可以提供多個文件名、或者目錄名。

這個命令把生成的歸檔文件寫入到標準輸出,以便通過管道把歸檔文件的內容傳遞給 openssl 命令處理。

查看 GNU tar 的在線幫助鏈接
https://www.gnu.org/software/tar/manual/tar.html,對使用 - 作為文件名的說明如下:

If you use '-' as an archive-name, tar reads the archive from standard input (when listing or extracting files), or writes it to standard output (when creating an archive).If you use '-' as an archive-name when modifying an archive, tar reads the original archive from its standard input and writes the entire new archive to its standard output.

即,在創建歸檔文件時,使用 - 作為文件名,會把生成歸檔文件寫入到標準輸出,不會生成文件到本地文件系統上。

在提取歸檔文件時,使用 - 作為文件名,會從標準輸入讀取要提取的歸檔文件。

openssl des3 -salt -k passwd 命令指定用 des3 算法進行加密,-k passwd 指定加密加密,可以修改 passwd 成其他密碼。如果需要用其他算法進行加密,可以查看 openssl 的幫助說明。

如果不想在終端上明文輸入密碼,可以不提供 -k passwd 選項,會提示從終端輸入密碼,不會回顯。

dd of=filename.des3 命令指定加密後的文件名為 filename.des3,可以修改成其他文件名。

對歸檔文件進行解密

使用上面命令對歸檔文件價加密後,可以使用下面命令進行解密:

<code>

dd

if=filename.des3 | openssl des3 -d -k passwd | tar zxf - /<code>

dd if=filename.des3 命令指定讀取 filename.des3 文件內容。

openssl des3 -d -k passwd 命令表示使用 des3 算法進行解密。

解密之後的內容是之前 tar 命令生成的歸檔文件內容,會寫入到標準輸出,通過管道傳遞給後面 tar 命令的標準輸入。

可以不提供 -k passwd 選項,執行時會提示從終端輸入密碼,不會回顯。

tar zxf - 命令表示從標準輸入讀取要提取的歸檔文件內容,提取出來的文件會寫入到本地。


分享到:


相關文章: