文件操作之zip、bzip2、gzip、tar命令
先讲些简单的概念,因为对于初学者对linux下压缩文件容易搞晕。因为我们常见压缩文件为.zip,.tar.zip,.bzip2,.tar.bz2,.gz,.Z,.tar等等。
首先要理解的是在linux系统存在“打包”和“压缩”两个概念。“打包”只是把一个或多个文档打包放到一个文档中而已,不存在压缩。“压缩”是通过压缩方法将文件压缩更小文件,简单的理解就是通过压缩方法将文件重新编码成占用空间更小的文件(并不是绝对的,对于大文件会更小,但对于很小文件需要记录压缩信息可能会导致压缩后文件更大)。
linux下常用打包命令:tar。为了易读性,一般将文件命名为.tar文件,所以.tar文件并不是压缩文件。
linux下常用压缩命令就很多了,如:zip,gzip,bzip2,compress等。那怎么区分呢?为了易于区分一般通过命名方式来区别。.zip为zip方式压缩文件,.gz为gzip方式压缩文件,.bz2为bzip2压缩文件,.Z为compress压缩文件。所以我们看到.tar.gz文件即为先打包后通过gzip压缩的文件,其他与此类似。
一、zip命令
1,常用参数:
-d:从压缩文件内删除指定的文件。
-g:将文件压缩后附加在既有的压缩文件之后,而非另行建立新的压缩文件。
-r:递 归处理,将指定目录下的所有文件和子目录一并处理。
-<压缩效率> 压 缩效率是一个介于1-9的 数值。
2,实例
#将test.txt文件压缩为test.zip文件
[root@localhost test]# zip test.ziptest.txt
adding: test.txt (deflated 35%)
#压缩率为1,最高压缩率,当然也是最慢的压缩方法
[root@localhost test]# zip -1 test.ziptest.txt
adding: test.txt(deflated 35%)
#压缩率依然为35,因为压缩文件为文本文件压缩率基本不变
#-r递归压缩子目录
[root@localhost test]# zip -r test.zip./test/
adding: test/ (stored 0%)
adding: test/test/ (stored 0%)
adding: test/test.txt (deflated 35%)
#-d 删除已有zip文件中文件
[root@localhost test]# zip -r test.zip test
adding: test/ (stored 0%)
adding: test/test/ (stored 0%)
adding: test/test.txt (deflated 35%)
[root@localhost test]# zip -d test.ziptest/test.txt
deleting: test/test.txt
#-m向已有zip文件增加压缩文件
[root@localhost test]# zip -m test.zip./test/test.txt
adding: test/test.txt (deflated 35%)
#-x排除制定文件不压缩
[root@localhost test]# zip -r test.zip test-x ./test/test.txt
updating: test/ (stored 0%)
updating: test/test/ (stored 0%)
updating: test/test2.txt (deflated 63%)
二、unzip命令:解压缩命令,即zip反操作命令。
1,常用参数
-t 检查压缩文件是否正确。,但不解压。
-v 执行是时显示详细的信息。或查看压缩文件目录,但不解压。
-n 解压缩时不要覆盖原有的文件。
-o 不必先询问用户,unzip执 行后覆盖原有文件,即强制覆盖。
-j 不处理压缩文件中原有的目录路径。
-P<密码> 使用zip的密码选项。
2,实例
#解压缩文件test.zip
[root@localhost test]# unzip test.zip
Archive: test.zip
creating: test/
creating: test/test/
inflating: test/test2.txt
#-v查看压缩文件目录及文件信息,并不解压
[root@localhost test]# unzip -v test.zip
Archive: test.zip
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- --------------- -------- ----
0 Stored 0 0% 10-08-2015 22:41 00000000 test/
0 Stored 0 0% 10-08-2015 22:24 00000000 test/test/
2117 Defl:N 781 63% 10-08-2015 22:41 ef2699cd test/test2.txt
-------- ------- --- -------
2117 781 63% 3 files
三、gzip命令:gzip [选项] 压缩(解压缩)的文件名
1,选项参数
-d:将压缩文件解压,gzip命令是通过-d来实现解压缩的。
-r:同样是递归压缩。
-t:测试,检查文件完整性。
-v:显示压缩详细过程信息。
-<数字>:指定压缩率(速度)。
2,实例
#gzip是单个压缩文件的,-r递归压缩
[root@localhost test]# gzip -r test
[root@localhost test]# ls test
test test2.txt.gz test.txt.gz
[root@localhost test]# ls ./test/test
test.txt.gz
[root@localhost test]# gzip test
gzip: test is a directory – ignored
[root@localhost test]# tree test
test
├── test
│ └── test.txt.gz
├── test2.txt.gz
└── test.txt.gz
#解压文件
[root@localhost test]# gzip -rd test
[root@localhost test]# tree test
test
├── test
│ └── test.txt
├── test2.txt
└── test.txt
1 directory, 3 files
#先使用tar命令打包,再压缩
[root@localhost test]# tar -cvf test.tartest
test/
test/test/
test/test/test.txt
test/test2.txt
test/test.txt
[root@localhost test]# ls
test test.tar test.txt
[root@localhost test]# gzip test.tar
#-<数字>自定义压缩率,默认为6
[root@localhost test]# gzip -v -1 test.tar
test.tar: 88.4% -- replaced with test.tar.gz
[root@localhost test]# gzip -d test.tar.gz
[root@localhost test]# gzip -v -9 test.tar
test.tar: 89.7% -- replaced with test.tar.gz
四、bzip2命令:命令与gzip类似。
1,实例
#bzip2不能压缩目录,也不在类似-r的可选项参数。
[root@localhost test]# bzip2 test
bzip2: Input file test is a directory.
[root@localhost test]# bzip2 test.txt
[root@localhost test]# ls
test test.tar test.txt.bz2
#同样可以通过-d实现解压缩
[root@localhost test]# bzip2 -dtest.txt.bz2
[root@localhost test]# bzip2 test.tar
[root@localhost test]# bzip2 -vdtest.tar.bz2
test.tar.bz2: done
[root@localhost test]# ls
test test.tar test.txt
#通过bzcat命令可以直接读压缩文件信息
[root@localhost test]# ls
test test.tar.bz2 test.txt.bz2
[root@localhost test]# bzcat test.txt.bz2
test
test2
test12
五、tar 命令:tar实际是一个打包命令,但是它可以调用压缩bzip2,gzip来实现压缩。
1,选项参数
tar选项可以分为二部分。
第一部分:主选项
-c:--create 创建新文档,即打包文件。
-x:--extract(提取),从文档中释放文件,即将打包文件拆包。
-t: --list 列出文档中的内容,即查看打包内的内容。
以上三个为必选,但仅能存在一个,不可能同时打包又拆包。
第二部分:辅助选项(常用)
-f:--file=ARCHIVE用户指定打包后的文件或解包后的文件名。后面接的一定是文件名。
-z:即使用gzip压缩/解压。调用gzip来实现解/压缩,一般格式为.tar.gz或.tgz。
-j:即调用bzip2来解/压缩,一般格式为.tar.bz2
-v: --verbose显示解/压缩过程信息。
-p:preserve-permissions保留权限,即使用原来属性。
--exclude FILE:在压缩过程中,将FILE排除在外,即对FILE不打包。
2,实例
#最简单的打包命令,必须包含-c(打包),-f指定打包后文件。
[root@localhost test]# tar -cf test.tartest
[root@localhost test]# ls
f1 f2 test test.tar
#打包并且使用bzip2压缩文件
[root@localhost test]# tar -cjvftest.tar.bz2 test
test/
test/test.tar.bz2
test/test/
test/test/test/
test/test/test/test.txt
test/test/test2.txt
test/test/test.txt
test/test.txt.bz2
[root@localhost test]# ls
f1 f2 test test.tar.bz2
#解压缩bzip2压缩包
[root@localhost test]# tar -xjvftest.tar.bz2
test/
test/test.tar.bz2
test/test/
test/test/test/
test/test/test/test.txt
test/test/test2.txt
test/test/test.txt
test/test.txt.bz2
#打包绝对路径文件:会提示将“/”移除
[root@localhost test]# tar -cvf passwd.tar/etc/passwd
tar: Removing leading `/' from member names
/etc/passwd
#查看打包文件,可以看到根(/)符号去掉了。
[root@localhost test]# tar -tf passwd.tar
etc/passwd
3,tar还有很多很有用但又不常用的选项
默认情况下tar在拆包是无法显示将拆包后文件指定到其他目录,这是就可以用到-C+dir命令了。如下:
[root@localhost test]# tree
.
├── f1
├── f2
└── test
1 directory, 2 files
[root@localhost test]# tar -cvf f.tar f1 f2
f1
f2
[root@localhost test]# tar -xf f.tar./test/
tar: ./test: Not found in archive
tar: Exiting with failure status due toprevious errors
[root@localhost test]# tar -xf f.tar -C./test/
[root@localhost test]# tree
.
├── f1
├── f2
├── f.tar
└── test
├── f1
└── f2
1 directory, 5 files
-d: --diff,--compare 找出归档文件和文件系统的不同之处
-r:--append将文件附加到打包文件之后。
-u: --update 只打包文档中的新文件
-A:--catenate 将tar文件附加到归档文件之后
--delete:将文件从打包文件中删除
[root@localhost test]# tar -cvf f1.tar f1
f1
[root@localhost test]# tar -cvf f2.tar f2
f2
[root@localhost test]# tar -tvf f.tar
-rw-r----- root/root 34 2015-10-08 04:05 f2
-rw-r----- root/root 34 2015-10-08 04:05 f1
[root@localhost test]# tar -A f1.tar -vff.tar
[root@localhost test]# tar -tvf f.tar
-rw-r----- root/root 34 2015-10-08 04:05 f2
-rw-r----- root/root 34 2015-10-08 04:05 f1
-rw-r----- root/root 34 2015-10-08 04:05 f1
[root@localhost test]# tar --delete f2 -vff.tar
[root@localhost test]# tar -tvf f.tar
-rw-r----- root/root 34 2015-10-08 04:05 f1
-rw-r----- root/root 34 2015-10-08 04:05 f1
[root@localhost test]# tar -r f2 -vf f.tar
f2
[root@localhost test]# tar -u f1 -vf f.tar
[root@localhost test]# tar -tvf f.tar
-rw-r----- root/root 34 2015-10-08 04:05 f1
-rw-r----- root/root 34 2015-10-08 04:05 f1
-rw-r----- root/root 34 2015-10-08 04:05 f2
[root@localhost test]# touch f3
[root@localhost test]# tar -u f3 -vf f.tar
f3
[root@localhost test]# tar -tvf f.tar
-rw-r----- root/root 34 2015-10-08 04:05 f1
-rw-r----- root/root 34 2015-10-08 04:05 f1
-rw-r----- root/root 34 2015-10-08 04:05 f2
-rw-r--r-- root/root 0 2015-10-09 02:48 f3
-N date:--newer=date 经常用于备份新文件。
[root@localhost test]# ll
total 48
-rw-r-----. 1 root root 34 Oct 8 04:05 f1
-rw-r--r--. 1 root root 10240 Oct 9 02:45 f1.tar
-rw-r-----. 1 root root 34 Oct 8 04:05 f2
-rw-r--r--. 1 root root 10240 Oct 9 02:45 f2.tar
-rw-r--r--. 1 root root 0 Oct 9 02:48 f3
-rw-r--r--. 1 root root 10240 Oct 9 02:48 f.tar
drwxr-xr-x. 2 root root 4096 Oct 9 01:46 test
[root@localhost test]# tar -N '2015/10/9'-cvf N.tar ./*
tar: Option --after-date: Treating date`2015/10/9' as 2015-10-09 00:00:00
tar: ./f1: file is unchanged; not dumped
./f1.tar
tar: ./f2: file is unchanged; not dumped
./f2.tar
./f3
./f.tar
./test/
./test/f2
./test/f1
[root@localhost test]# ls
f1 f1.tar f2 f2.tar f3 f.tar N.tar test
[root@localhost test]# tar -tvf N.tar
-rw-r--r-- root/root 10240 2015-10-09 02:45 ./f1.tar
-rw-r--r-- root/root 10240 2015-10-09 02:45 ./f2.tar
-rw-r--r-- root/root 0 2015-10-09 02:48 ./f3
-rw-r--r-- root/root 10240 2015-10-09 02:48 ./f.tar
drwxr-xr-x root/root 0 2015-10-09 01:46 ./test/
-rw-r----- root/root 34 2015-10-08 04:05 ./test/f2
-rw-r----- root/root 34 2015-10-08 04:05 ./test/f1
--mode=permissions
备份时,把加入备份文件中的文件属性修改为指定的属性,格式和chmod命令接受的格式相同
--group=group
备份时,把加入备份文件中的文件所属组设定成指定的组
--owner=owner
备份时,把把加入备份文件中的文件所有者设定成指定的用户
[root@localhost test]# tar --owner=test--group=ding --mode=764 -cf test.tar ./*
[root@localhost test]# ll test.tar
-rw-r--r--. 1 root root 81920 Oct 9 02:58 test.tar
[root@localhost test]# tar -tvf test.tar
-rwxrw-r-- test/ding 34 2015-10-08 04:05 ./f1
-rwxrw-r-- test/ding 10240 2015-10-09 02:45 ./f1.tar
-rwxrw-r-- test/ding 34 2015-10-08 04:05 ./f2
-rwxrw-r-- test/ding 10240 2015-10-09 02:45 ./f2.tar
-rwxrw-r-- test/ding 0 2015-10-09 02:48 ./f3
-rwxrw-r-- test/ding 10240 2015-10-09 02:48 ./f.tar
-rwxrw-r-- test/ding 40960 2015-10-09 02:52 ./N.tar
drwxrw-r-- test/ding 0 2015-10-09 01:46 ./test/
-rwxrw-r-- test/ding 34 2015-10-08 04:05 ./test/f2
-rwxrw-r-- test/ding 34 2015-10-08 04:05 ./test/f1
-k:--keep-old-files 解包时不覆盖已有的文件
-m:--modification-time 解包时不更改时间
-s –same-order :保持相同的顺序还原
还可以通过管道技术实现‘copy’功能。
[root@localhost test]# tar -cvf - ./* | tar-xvf - -C ./test/
./f1
./f2
./test/
./f1
./f2
./test/
[root@localhost test]# tree
.
├── f1
├── f2
└── test
├── f1
├── f2
└── test
2 directories, 4 files