0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Linux 壓縮與解壓縮

Last updated at Posted at 2017-05-07

檔案壓縮有很多種方式,所以也有很多的壓縮格式,各種壓縮方式也有它的優缺點,當然這不是這篇的重點,這篇主要是要說在Linux上面壓縮與解壓縮的方式。

在Linux上面其中壓縮格式比較常見的有.zip.gz.bz2.tar.gz.tar.bz2

在壓縮的過程中,其實可以不用把副檔名寫上去,因為Linux是不會認這個東西的,但是為了方便辨認大部分操作上,還是要寫上去才可以。

.zip

zip 壓縮

zip [option] [filename] [source file]

zip -r [filename] [source file]

$ touch myfile
$ zip myfile.zip myfile
adding: myfile (stored 0%) ## 因為myfile是空文件所以為0%
$ mkdir myfiles
$ mv myfile myfiles
$ zip myfile.zip myfile/ ## 只有壓縮目錄,解壓縮為空目錄
  adding: myfile/ (stored 0%)
$ zip -r  myfile.zip myfile/ ## 只有壓縮目錄及目錄下的檔案
updating: myfile/ (stored 0%)
  adding: myfile/asdf (stored 0%)

unzip 解壓縮

$ unzip myfile.zip
Archive:  myfile.zip
   creating: myfile/
 extracting: myfile/myfile

.gz

gzip 壓縮

gzip [source file]

$ touch myfile
$ gzip myfile
$ ll
總計 8
drwxr-xr-x. 15 root     root     4096  4月  4 19:56 DIR-850L_A1
-rw-rw-r--.  1 cyberjun cyberjun   27  4月 26 19:29 myfile.gz

gzip -c [source file] > [filename]

$ touch myfile
$ gzip -c myfile > myfile.gz
$ ll
總計 8
drwxr-xr-x. 15 root     root     4096  4月  4 19:56 DIR-850L_A1
-rw-rw-r--.  1 cyberjun cyberjun    0  4月 26 19:32 myfile
-rw-rw-r--.  1 cyberjun cyberjun   27  4月 26 19:32 myfile.gz

gzip在壓縮之後原本的文件會消失,所以我們要把命令的結果寫到新的文件儲存,也就是使用>把結果給[filename]。

gzip -r [directory]

$ mkdir myfiles
$ cd myfiles
$ touch myfile1
$ touch myfile2
$ touch myfile3
$ cd ..
$ gzip -r  myfiles
$ ll
總計 4
drwxr-xr-x. 15 root     root     4096  4月  4 19:56 DIR-850L_A1
drwxrwxr-x.  2 cyberjun cyberjun   60  4月 26 19:35 myfiles
$ cd myfiles
$ ll
總計 12
-rw-rw-r--. 1 cyberjun cyberjun 28  4月 26 19:34 myfile1.gz
-rw-rw-r--. 1 cyberjun cyberjun 28  4月 26 19:34 myfile2.gz
-rw-rw-r--. 1 cyberjun cyberjun 28  4月 26 19:34 myfile3.gz

執行完這個指令之後他會把目錄下面的所有文件一個一個壓縮,但是不會把目錄給壓縮。

gzip -d或gunzip解壓縮

$ gzip -d myfile.gz
$ gunzip myfile.gz
$ gunzip myfiles.gz
$ cd myfiles
$ ll
總計 12
-rw-rw-r--. 1 cyberjun cyberjun 28  4月 26 19:34 myfile1.gz
-rw-rw-r--. 1 cyberjun cyberjun 28  4月 26 19:34 myfile2.gz
-rw-rw-r--. 1 cyberjun cyberjun 28  4月 26 19:34 myfile3.gz
$ cd ..
$ gunzip -r myfiles
gzip: myfiles is a directory -- ignored ## 目錄要 -r
$ gunzip -r  myfiles
$ ll
總計 4
drwxr-xr-x. 15 root     root     4096  4月  4 19:56 DIR-850L_A1
drwxrwxr-x.  2 cyberjun cyberjun   51  4月 26 19:42 myfiles
$ cd myfiles/
$ ll
總計 0
-rw-rw-r--. 1 cyberjun cyberjun 0  4月 26 19:34 myfile1
-rw-rw-r--. 1 cyberjun cyberjun 0  4月 26 19:34 myfile2
-rw-rw-r--. 1 cyberjun cyberjun 0  4月 26 19:34 myfile3

.bz2

bzip2 壓縮

bzip2 [sourcefile]

$ touch abc
$ bzip2 abc
$ ll
總計 4
-rw-rw-r--.  1 cyberjun cyberjun   14  4月 26 19:49 abc.bz2

這個樣子原本的文件會和gzip一樣消失,如果要保留原本的文件要使用-k

bzip2 -k [sourcefile]

$ touch -k abc
$ bzip2 abc
$ ll
總計 8
-rw-rw-r--.  1 cyberjun cyberjun    0  4月 26 19:52 abc
-rw-rw-r--.  1 cyberjun cyberjun   14  4月 26 19:52 abc.bz2

使用-k這個樣子原本的文件保留下來了。

bzip2不能壓縮目錄

$ mkdir abc
$ bzip2 abc
bzip2: Input file abc is a directory.

bzip2並沒有支援目錄壓縮

bzip2 -d或bunzip2解壓縮

$ touch abc
$ bzip2 abc
$ bzip2 -d abc.bz2
$ ll
abc.bz2
$ rm -rf ab*
$ touch abc
$ bzip2 abc
$ bunzip2 abc.bz2
$ ls
abc.bz2

解壓縮執行之後原本的檔案會消失,所以如果要保留原本的檔案要使用-k

$ bunzip -k abc.bz2
$ bzip -dk abc.bz2

tar 打包

由於gzip和bzip2不能把目錄壓縮起來所以就有了tar了打包,如果要壓縮的話就只要把檔案先打包起來再壓縮成.tar.gz.tar.bz2就可以了

tar -cvf 打包

tar -cvf [filename] [sourcefile]

  • -c: 打包
  • -v: 顯示打包過程
  • -f: 指定打包後的文件名稱
$ mkdir myfiles
$ cd myfiles/
$ touch myfile1
$ touch myfile2
$ touch myfile
$ cd ..
$ tar -cvf myfiles.tar myfiles
myfiles/
myfiles/myfile1
myfiles/myfile2
myfiles/myfile
$ ll
總計 16
drwxrwxr-x.  2 cyberjun cyberjun    50  4月 26 20:14 myfiles
-rw-rw-r--.  1 cyberjun cyberjun 10240  4月 26 20:14 myfiles.tar

之後如果想要在進行gzip、bzip2壓縮的話,就直接執行壓縮如下:

$ gzip -c myfiles.tar > 
$ bzip2 -k myfiles.tar
$ ll
總計 24
drwxrwxr-x.  2 cyberjun cyberjun    50  4月 26 20:14 myfiles
-rw-rw-r--.  1 cyberjun cyberjun 10240  4月 26 20:14 myfiles.tar
-rw-rw-r--.  1 cyberjun cyberjun   191  4月 26 20:14 myfiles.tar.bz2
-rw-rw-r--.  1 cyberjun cyberjun   191  4月 26 20:18 myfiles.tar.gz

tar -xvf 解打包

tar -xvf [.tar file]

  • -x 解打包

解.tar.gz

$ gunzip -c myfiles.tar.gz > myfiles.tar
$ tar -xvf myfiles.tar
myfiles/
myfiles/myfile1
myfiles/myfile2
myfiles/myfile
$ ll
總計 24
drwxrwxr-x.  2 cyberjun cyberjun    50  4月 26 20:14 myfiles
-rw-rw-r--.  1 cyberjun cyberjun 10240  4月 26 20:31 myfiles.tar
-rw-rw-r--.  1 cyberjun cyberjun   191  4月 26 20:27 myfiles.tar.gz

解.tar.bz2

$ bunzip -k myfiles.tar.bz2
$ tar -xvf myfiles.tar
$ ll
總計 24
drwxrwxr-x.  2 cyberjun cyberjun    50  4月 26 20:14 myfiles
-rw-rw-r--.  1 cyberjun cyberjun 10240  4月 26 20:28 myfiles.tar
-rw-rw-r--.  1 cyberjun cyberjun   191  4月 26 20:14 myfiles.tar.bz2

打包.tar.gz和.tar.bz2

tar是支援直接打包成.tar.gz.tar.bz2的,所以其實不需要像之前那個樣子壓縮與解壓縮這麼麻煩。

tar -z cvf或xvf

tar -zcvf [filename.tar.gz] [sourcefile]

tar -zxvf [sourcefile.tar.gz]

如果要打包成.tar.gz的話,只要在之前的打包指令前面加上-z即可。

$ tar -zcvf myfiles.tar.gz myfiles/
myfiles/
myfiles/myfile1
myfiles/myfile2
myfiles/myfile
$ rm -rf myfiles
$ tar -zxvf myfiles.tar.gz
myfiles/
myfiles/myfile1
myfiles/myfile2
myfiles/myfile
$ ll
總計 8
drwxrwxr-x.  2 cyberjun cyberjun   50  4月 26 20:14 myfiles
-rw-rw-r--.  1 cyberjun cyberjun  179  4月 26 20:46 myfiles.tar.gz

tar -j cvf 或xvf

tar -jcvf [filename.tar.bz2] [sourcefile]

tar -jxvf [sourcefile.tar.bz2]

如果要打包成.tar.bz2的話,只要在之前的打包指令前面加上-j即可。

$ tar -jcvf myfiles.tar.bz2 myfiles/
myfiles/
myfiles/myfile1
myfiles/myfile2
myfiles/myfile
$ rm -rf myfiles
$ tar -jxvf myfiles.tar.bz2
myfiles/
myfiles/myfile1
myfiles/myfile2
myfiles/myfile
$ ll
總計 8
drwxrwxr-x.  2 cyberjun cyberjun   50  4月 26 20:14 myfiles
-rw-rw-r--.  1 cyberjun cyberjun  191  4月 26 20:48 myfiles.tar.bz2

tar 指定解壓縮位置

tar -xvf [sourcefile.tar] -C [directory]

$ tar -zcvf myfiles.tar.gz myfiles/
myfiles/
myfiles/myfile1
myfiles/myfile2
myfiles/myfile
$ tar -zxvf myfiles.tar.gz -C /tmp/
$ ll /tmp/
總計 8
drwxrwxr-x.  2 cyberjun cyberjun   50  4月 26 20:14 myfiles
drwx------. 3 root root 17  4月 26 14:45 systemd-private-14d94e1345584cf1b22f365c4e00445b-vmtoolsd.service-6dKW4n

tar 壓縮多個文件

tar -cvf [filename.tar] [file1] [file2]....etc.

如果要指定壓縮位置的話,只要把[filename.tar]用絕對路徑去寫就可以了。

$ ll
總計 8
-rw-rw-r--. 1 cyberjun cyberjun   0  4月 26 20:14 myfile
-rw-rw-r--. 1 cyberjun cyberjun   0  4月 26 20:13 myfile1
-rw-rw-r--. 1 cyberjun cyberjun   0  4月 26 20:14 myfile2
-rw-rw-r--. 1 cyberjun cyberjun 142  4月 26 21:01 myfile3.tar.bz2
-rw-rw-r--. 1 cyberjun cyberjun 139  4月 26 21:01 myfile3.tar.gz
drwxrwxr-x. 2 cyberjun cyberjun   6  4月 26 20:59 myfiledir
$ tar -cvf ~/myfiles.tar myfile myfile1 myfile2 myfile3.tar.bz2  myfile3.tar.gz
myfile
myfile1
myfile2
myfile3.tar.bz2
myfile3.tar.gz
$ cd
$ ll
總計 16
-rw-rw-r--.  1 cyberjun cyberjun 10240  4月 26 21:02 myfiles.tar
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?