【Linux学习笔记】压缩和打包命令

【Linux学习笔记】压缩和打包命令
【1.打包与压缩】 首先我们有必要区分一下“打包”和“压缩”这两个概念。在Windows平台用久了,很容易把这两个概念混在一起。Linux下的打包仅仅是把多个文件“捆绑”成一个文件(实际上可以理解为用一个文件夹来保存这些文件),但不降低这些文件总体的磁盘占用空间。而压缩则是通过诸如空白bit压缩等方式来减少这些文件所占用的磁盘空间。

【2.gzip和zcat】 gzip和zcat命令分别用来压缩文件和读取压缩文件中的内容。其语法格式如下:
[root@www  ~ ]# gzip [ - cdtv#] 文件名
[root@www 
~ ]# zcat 文件名.gz

-c:将压缩的资料输出到屏幕上,可以将输出流重定向到其它地方
-d:解压缩的参数
-v:显示压缩比
-#:压缩等级,-1最快,-9最慢,预设-6

注意:使用gzip时默认会把原文件压缩成.gz文件,而原文件会被删除。如果要保持原文件的存在,则要使用参数-c和输出流重定向符>。
[root @www  tmp] #  gzip  -cv man.config > man.config.gz

这里我们使用了输出流重定向,将压缩后的内容重定向到当前目录下的man.config.gz,而保留源文件不变。如果需要解压文件我们也可以选择用gzip而不需要用gunzip。
[root @www  tmp] #  gzip -d man.config.gz

我们也可以不解压而直接查看压缩文档的内容,方法就是使用zcat命令
[root @www  tmp] #  zcat man.config.gz

【3.tar命令】 tar命令用于对若干文件进行打包,具体用法参考如下(参见《鸟哥的Linux私房菜》)
[root @www   ~ ] #  tar [-j|-z] [cv] [-f 建立的檔名] filename <==打包與壓縮
[root @www   ~ ] #  tar [-j|-z] [tv] [-f 建立的檔名]             <==察看檔名
[root @www   ~ ] #  tar [-j|-z] [xv] [-f 建立的檔名] [-C 目錄]   <==解壓縮
選項與參數:
- c:建立打包檔案,可搭配  - v 來察看過程中被打包的檔名(filename)
- t:察看打包檔案的內容含有哪些檔名,重點在察看『檔名』就是了;
-x: 解打包或解壓縮的功能,可以搭配  - C (大寫) 在特定目錄解開
      特別留意的是, 
- c ,   - t ,   -x  不可同時出現在一串指令列中。
- j:透過 bzip2 的支援進行壓縮 / 解壓縮:此時檔名最好為  *. tar . bz2
- z:透過 gzip  的支援進行壓縮 / 解壓縮:此時檔名最好為  *. tar . gz
- v:在壓縮/解壓縮的過程中,將正在處理的檔名顯示出來
- f filename: - f 後面要立刻接要被處理的檔名!建議  - f 單獨寫一個選項囉!
- C 目錄:這個選項用在解壓縮,若要在特定目錄解壓縮,可以使用這個選項。

注意:打包后的文件名需要我们自己加后缀名区分以利于区别,tar命令并不会帮我们加后缀名

①使用tar命令压缩文件并查看信息
[ root@localhost / ] # tar -jcpv -f test.tar.bz2 test
test/
test/test1/
test/test1/test2/
test/test1/test2/test3/
test/test1/test2/test3/test4/

[ root@localhost / ] # tar -zcpv -f test.tar.gz test
test/
test/test1/
test/test1/test2/
test/test1/test2/test3/
test/test1/test2/test3/test4/

[ root@localhost / ] # ll test.tar.*
-rw-r--r--  
1  root root  183   2月  19   10 : 04  test.tar.bz2
-rw-r--r--  
1  root root  170   2月  19   10 : 05  test.tar.gz

[ root@localhost / ] # tar -jtv -f test.tar.bz2
tar: Record size 
=   8  blocks
drwxr-xr-x root/root         
0   2009 - 02 - 19   09 : 52 : 45  test/
drwxr-xr-x root/root         
0   2009 - 02 - 19   09 : 52 : 45  test/test1/
drwxr-xr-x root/root         
0   2009 - 02 - 19   09 : 52 : 45  test/test1/test2/
drwxr-xr-x root/root         
0   2009 - 02 - 19   09 : 52 : 45  test/test1/test2/test3/
drwxr-xr-x root/root         
0   2009 - 02 - 19   09 : 52 : 45  test/test1/test2/test3/test4/

 
[ root@localhost / ] # tar -zt -f test.tar.gz
test/
test/test1/
test/test1/test2/
test/test1/test2/test3/
test/test1/test2/test3/test4/
[ root@localhost / ] #

这里我们需要特别注意的是当我们使用tar [-j|-z] cpv命令压缩文件时,文件绝对路径将变成现对于当前目录的路径(也就是根路径标示符/将被移除)

②搜寻压缩包内的指定文件并解压到指定目录
[ root@localhost / ] # tar -jtv -f test.tar.bz2 | grep 'test4'
tar: Record size 
=   16  blocks
drwxr-xr-x root/root         
0   2009 - 02 - 19   09 : 52 : 45  test/test1/test2/test3/test4/

 
[ root@localhost / ] # tar -jxv -f test.tar.bz2 test/test1/test2/test3/test4
test/test1/test2/test3/test4/

在上面的例子中,我们使用tar -jtv 命令首先查看压缩包的内容,然后用管道命令|把命令的执行结果作为grep命令的搜索参数,查找文件中包含'test4'的文件。然后我们就可以在tar命令的末尾加上特定的文件名,表明我们只需要解压指定的文件。

我们也可以使用另一种方式来搜索文件
[ root@localhost / ] # grep 'test4' <(tar -jtvf test.tar.bz2)
tar: Record size 
=   16  blocks
drwxr-xr-x root/root         
0   2009 - 02 - 19   09 : 52 : 45  test/test1/test2/test3/test4/

③在解压缩的同时查找文件

同样的我们不单可以在查看的过程中查找,我们同样可以在解压的过程中查找(比较适合在解压后的文件一大堆,需要快速找到文件的情况)
[ root@localhost / ] # tar -jxv -f test.tar.bz2 | grep 'test4'
test/test1/test2/test3/test4/

[ root@localhost / ] # ls
bin   etc     lib         misc  proc  selinux  test     test.tar.gz  usr
boot  home    lost+found  mnt   root  srv      testdir       tmp          var
dev   initrd  media       opt   sbin  sys      test.tar.bz2  u01

④在解压时不包含某些文件或目录
[ root@localhost / ] # ls
bin   etc     lib         misc  proc  selinux  testdir  usr
boot  home    lost+found  mnt   root  srv      tmp      var
dev   initrd  media       opt   sbin  sys      u01

[ root@localhost / ] # tar -jcvf testdir.tar.bz2 testdir --exclude t1.txt \
> --exclude testdir2
testdir/
testdir/t2.txt
testdir/t3.txt

[ root@localhost / ] #

这里要特别注意的是:exclude前面是--,另外exclude每次只能带一个参数,如果需要剔除多个选项,要用多个--exclude组合

⑤备份在某个时间点之后更新的文件
[ root@localhost / ] # ls
bin   etc     lib         misc  proc  selinux  testdir          u01
boot  home    lost+found  mnt   root  srv      testdir.tar.bz2  usr
dev   initrd  media       opt   sbin  sys      tmp              var

[ root@localhost / ] # tar -jcpvf testdir_newer_than_090101.tar.bz2 \
--newer-mtime='2009-01-01
testdir
tar: Treating date `
2009 - 01 - 01 ' as  2009 - 01 - 01   00 : 00 : 00  +  0  nanoseconds
testdir/
testdir/t1.txt
testdir/t2.txt
testdir/t3.txt
testdir/testdir2/

[ root@localhost / ] # tar -jtvf testdir_newer_than_090101.tar.bz2
tar: Record size 
=   8  blocks
drwxr-x--x paul/root         
0   2009 - 02 - 19   14 : 51 : 49  testdir/
-rw-rw-r-- paul/paul        
21   2009 - 02 - 19   14 : 45 : 51  testdir/t1.txt
-rw-r--r-- root/root         
0   2009 - 02 - 19   11 : 34 : 21  testdir/t2.txt
-rw-r--r-- root/root         
0   2009 - 02 - 19   11 : 34 : 24  testdir/t3.txt
drwxr-xr-x root/root         
0   2009 - 02 - 19   11 : 34 : 31  testdir/testdir2/
[ root@localhost / ] #

--newer-mtime这个参数让我们在备份时只备份那些mtime时间比指定时间还要新的文件。如果我们只是使用了--newer,那么将比较文件的mtime和ctime。


-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。

你可能感兴趣的:(【Linux学习笔记】压缩和打包命令)