如何使用tar/gzip命令压缩与解压缩文件和split/cat命令分割合并文件

  • A+

一、文件打包、压缩/解压缩
首先,你可以在自己的Linux环境上输入tar –help 或 tar –usage就可以看出其实tar这格指令可以操作的参数还蛮多的,但最常用的还是以下这几个参数,本文将以这些参数为范例来进行解说:

如何使用tar/gzip命令压缩与解压缩文件和split/cat命令分割合并文件

c:create,建立新的tar档
v:verbose,详细列出处理过程
f:filename,输出的tar档名称
x:extract,撷取出打包的文件
z:使用gzip进行压缩/解压缩 (压缩的工具不只gzip,但本文为以gzip为主要说明对象)
C:指定解打包或解压缩的目录,要注意的是这参数是大写的C
指令的基本语法
压缩:tar 参数 输出档名 文件来源
解压缩:tar 参数 文件来源

范例一:将目录或文件打包成tar档

以下指令是将「demo」这个目录(or文件)打包成「demo.tar」档,因为有加参数「v」的关系,所以会把处理过程显示在萤幕上

tar -cvf demo.tar ./demo/
范例二:将目录或文件打包压缩成tar.gz档

tar只是做打包的动作并无作压缩的处理,因此在这个范例里我们多加一个参数「z」,代表会利用gzip再进行压缩,让整体的文件大小更迷你,一般会在副档名结尾处加上「.gz」以更辨识,当然,若你的压缩工具并非是gzip,那么副档名可能就会不同了

tar -zcvf demo.tar.gz ./demo/
范例三:将tar或tar.gz档解打包/解压缩

承上所述,来源文件有没有用gzip进行压缩,我都是用档名是否以「.gz」为结尾来做为初步的判断,如果没有压缩那么就是纯「解打包」,只要套用参数「x」即可,例如要将「demo.tar」解打包,指令如下:(预设会把文件解打包至当前目录下)

tar -xvf demo.tar
若有来源文件有压缩,则只要再加上解压缩的参数「z」,因此,如果要将「demo.tar.gz」解压缩的话,指令会变成:

tar -zxvf demo.tar.gz
范例四:指定解打包/解压缩的目录

范例三的解打包/解压缩的位置预设都是在当前目录下,如果要指定某个目录输出的话,则要加入「C」这个参数,例如下面指令就是将文件解压缩到「 /home/demo」的目录下

tar -zxvf demo.tar.gz -C /home/demo
范例五:大量打包目录或文件
tar有一个好用的参数-T是一定要学会的:有时候我们想要一次打包很多文件,而且这些文件是散落各地的,此时就可以借由此参数接上一个文件列表,tar就会依据这里面的内容一个一个的去打包,让我们用实例来说明吧,语法如下:

tar -cvf demo.tar -T demo.list
而上面语法中的「demo.list」是可以自订名称的,内容则是想要打包的文件或者目录,例如:

/home/demo/test
/home/demo/abc.txt

意思是执行完这个指令后,tar会打包「test」这个目录以下所有的文件(包含子目录),以及「abc.txt」这个文件,所以如果未来有很多不同的文件或目录要打包时,只要更新这个文件就行了
二、大文件分割与合并

有些时候将文件分割是必要的,例如我最近遇到的例子就是随身碟有单档大小的拷贝限制,遇到这种情况,分割文件就是一个很好的解决方案。在Linux中,分割文件的指令为split,其指令参数如下:

a:suffix-length,文件编号的位数,预设为2位
b:bytes,指定分割的大小,单位为bytes
d:numeric,指定文件编号改以数字为主,原本预设是英文字母
n:CHUNKS number,将文件平均分割为多少个文件

指令的基本语法

分割:split 参数 来源档名 自订分割档名
合并:cat 来源档名 > 目的档名

范例六:将大文件分割成小档

[hello@demo-host demo]$ split -b 100MB demo.tar "demo_part_"
这个指令的意思是:将「demo.tar」档分割成小文件,每个文件大小为100MB,新档名则以「demo_part_」为开头(可以不用双引号括起来),预设的编号会用二位英文字母来做编排,所以可以看到下面执行的结果,其文件结尾是用「aa、ab、ac、ad…」的方式来编排

[hello@demo-host demo]$ split -b 100MB demo.tar "demo_part_"
[hello@demo-host demo]$ ls -al
总计 623112
drwxrwxr-x. 2 hello hello 102 3月 26 18:43 .
drwxrwxr-x. 11 hello hello 4096 3月 26 18:42 ..
-rw-rw-r--. 1 hello hello 100000000 3月 26 18:43 demo_part_aa
-rw-rw-r--. 1 hello hello 100000000 3月 26 18:43 demo_part_ab
-rw-rw-r--. 1 hello hello 100000000 3月 26 18:43 demo_part_ac
-rw-rw-r--. 1 hello hello 19024640 3月 26 18:43 demo_part_ad
-rw-r--r--. 1 hello hello 319024640 3月 26 17:15 demo.tar

那么我们可以指定的文件大小单位是什么呢?在官方的帮助文件有提到喔,以下就是各位单位大小的描述,基本就是有「B」的就是byte乘1000,没有「B」的乘1024,举例来说,1K = 1024 bytes、1KB = 1000 bytes、1M = 1024 * 1024 bytes、 1MB = 1000 * 1000 bytes,以此类推

SIZE is an integer and optional unit (example: 10M is 10*1024*1024). Units
are K, M, G, T, P, E, Z, Y (powers of 1024) or KB, MB, … (powers of 1000)

若不想用预设的英文字母来编排,则可以使用参数「d」,变成以数字做编排,亦可以加上「a」来指定编排的位数

[hello@demo-host demo]$ split -d -a 3 -b 100MB demo.tar demo_part_
例如在这个范例中,加入了「-d -a 3」等参数,表示要用三位数字进行编排

[hello@demo-host demo]$ split -d -a 3 -b 100MB demo.tar demo_part_
[hello@demo-host demo]$ ls -al
总计 623112
drwxrwxr-x. 2 hello hello 106 3月 26 20:30 .
drwxrwxr-x. 11 hello hello 4096 3月 26 18:42 ..
-rw-rw-r--. 1 hello hello 100000000 3月 26 20:30 demo_part_000
-rw-rw-r--. 1 hello hello 100000000 3月 26 20:30 demo_part_001
-rw-rw-r--. 1 hello hello 100000000 3月 26 20:30 demo_part_002
-rw-rw-r--. 1 hello hello 19024640 3月 26 20:30 demo_part_003
-rw-r--r--. 1 hello hello 319024640 3月 26 17:15 demo.tar

范例七:将大文件平均分割成N个小文件

如果懒的指定分割后的单档大小或者想指定分割后的文件个数,那么可利用参数「n」来达成,例如以下的范例就是将「demo.tar」这个文件平均分割成5个等份,至於单档大小系统会自动去计算

split -n 5 demo.tar demo_part_
范例八:将小文件合并

想要将分割后的文件合并回来,请用「cat」指令来进行:cat后面接要合并的文件名,如果不想打那么多小文件的话,可以用「*」来替代,最后利用「>」符号来将文件导至输出档,范例如下,该范例最后会把文件还原为「demo_recovery.tar」

cat demo_part_* > demo_recovery.tar
三、tar与split的合并使用

在上面的例子中,都是一个一个指令分开独自操作,但实际上Linux可以透过管线「|」来连接不同的指令
范例九:压缩文件并同时进行分割

在这个范例中,会先进行tar的打包压缩,然后将结果导至split指令进行分割,这里比较要注意的是因为tar的输出结果会直接给split使用,所以不需要特别指定档名,直接用「–」带过即可

tar zcvf - demo | split -b 100MB - "abc.part"
范例十:还原分割档并同时进行解压缩

和上个例子类似,本例是先利用cat将所有的分割档还原,然后导给tar指令进行解压缩,同样的,输出档名部分也用「–」带过即可

cat demo_part_* | tar -zxvf -
小结:以上几个范例在我的Linux使用过程中,出现的机率是相当大的,我个人认为对新手来说,若能熟练这几个范例的操作,那么也应该应付大部分的需求了,尤其是tar,请初学者记得要学会喔



发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: