这两天在研究tar命令,看了很多前辈的博客。参考前辈的文章自己做实验写一下心得。
擒贼先擒王这篇文章写的很仔细。参数详情请参考链接。
只用tar命令是打包的意思,发现一个有意思的事。先写一下吧
在根目录下创建名为tar的文件夹,并创建四个文本文件。
这里多用了几个命令,是为了练习一下。
rm -rf 是删除命令,-r 是删除目录的意思, -f 是强制删除。生产环境下不要乱用!!
例一
[[email protected] /]# mkdir tar
[[email protected] /]# cd tar
[[email protected] tar]# ls
[[email protected] tar]# man help > 1.txt //将help命令的详细信息重定向到1.txt
[[email protected] tar]# cat 1.txt > 2.txt //将1.txt文件内容重定向到2.txt
[[email protected] tar]# cp 2.txt 3.txt //复制2.txt并重命名为3.txt
[[email protected] tar]# touch 4.txt //新建4.txt空文档
[[email protected] tar]# ls
1.txt 2.txt 3.txt 4.txt
用 du 命令查看文档大小
例二
[[email protected] tar]# du -sh * //查看本目录所有文件的大小
104K 1.txt
104K 2.txt
104K 3.txt
0 4.txt
将 tar 文件夹下所有的txt文件打包(仅打包)成 all.tar
例三
[[email protected] tar]# tar -cvf all.tar *.txt //加上-v参数显示打包过程
1.txt
2.txt
3.txt
4.txt
查看打包后文件大小
例四
[[email protected] tar]# du -sh all.tar //查看指定文件的大小
312K all.tar
重新写入内容并查看其大小
例五
[[email protected] tar]# man ls > 4.txt //将信息重定向到文件内
[[email protected] tar]# tar -uf all.tar 4.txt //用-u参数更新包内内容
[[email protected] tar]# man ls >> 4.txt //将信息追加重定向到文件
[[email protected] tar]# du -sh 4.txt
20K 4.txt
不知道这是什么情况?明明已经更新文件了可是包里有好几个 4.txt 文件。
例六
[[email protected] tar]# tar -uf all.tar 4.txt //用-u参数更新包内内容
[[email protected] tar]# tar -tf all.tar //-t参数不解压的情况下查看包内文件
1.txt
2.txt
3.txt
4.txt
4.txt
包的大小也不对,可是解压出来后就只有一个 4.txt 了?这是咋回事,没弄明白。只是包内文件确实更新了!先记下,有空再仔细研究下原理。
例七
[[email protected] tar]# du -sh all.tar
768K all.tar
[[email protected] tar]# mkdir new //新建文件夹
[[email protected] tar]# tar -xf all.tar -C /tar/new // -x参数解压,-C (大写)用于指定解压文件夹
[[email protected] tar]# cd new
[[email protected] new]# ls
1.txt 2.txt 3.txt 4.txt
[[email protected] new]# du -sh
332K .
增加新文件
先把原来的文件删了,再重新创建一个。查看包内内容那么别扭呢?
例八
[[email protected] tar]# rm -rf all.tar
[[email protected] tar]# tar -cf all.tar *.txt
[[email protected] tar]# ls
1.txt 2.txt 3.txt 4.txt all.tar
[[email protected] tar]# touch 5.txt
[[email protected] tar]# tar -rf all.tar 5.txt //-r 参数追加写入文件
[[email protected] tar]# tar -tf all.tar
1.txt
2.txt
3.txt
4.txt
5.txt
以上几个参数不能叠加使用,即 tar 后必须且只能出现一个,不能同时打包、更新、追加、解压、查看。
-f 参数只能是最后一个参数,-f 参数后紧跟打包后的文件名。
压缩参数 -z -j
下面再玩玩压缩参数吧,单独使用 tar 不加 -z 或 -j 参数文件只会是打包。不会压缩
先试试 -z 参数,gzip格式打包一下看一下效果吧!
例九
[[email protected] tar]# tar -czvf all.tar.gz *.txt && du -sh *
1.txt
2.txt
3.txt
4.txt
232K 1.txt
104K 2.txt
104K 3.txt
20K 4.txt
112K all.tar.gz
效果显而易见,压缩率还是很高的
下面来玩一下解压某个文件夹内的指定文件/文件夹吧!
又学了一招,命令回传码 (与 或)
与 || 前面的命令执行失败后执行后面的命令。
或 && 是前面的命令执行成功后执行后面的命令
例十
[[email protected] tar]# ls /tar/new || mkdir /tar/new && touch /tar/new/5.txt && ls
ls: cannot access /tar/new: No such file or directory
1.txt 2.txt 3.txt 4.txt new
[[email protected] tar]# tar -czvf all.tar.gz * && rm -rf new && ls
1.txt
2.txt
3.txt
4.txt
new/
new/5.txt
1.txt 2.txt 3.txt 4.txt all.tar.gz
首先在本目录下解压
要知道路径是个什么东西
绝对路径 :从根目录开始写起的文件或目录名称
相对路径 :相对于当前路径的写法
需要注意的是命令后的路径为 相对路径,实验多次如果路径输错会报警,命令执行不成功。
看看错误的示例
例十一
[[email protected] tar]# tar -xzvf all.tar.gz /tar/new/5.txt && ls
tar: /tar/new/5.txt: Not found in archive
tar: Exiting with failure status due to previous errors
以下是正确的示例
例十二
[[email protected] tar]# tar -xzvf all.tar.gz new/5.txt
//注意路径为相对路径
new/5.txt //成功
再来玩一下在别的目录下解压到某一个指定的目标吧
例十三
[[email protected] tar]# rm -rf all.tar.gz
[[email protected] tar]# ll
total 268
-rw-r--r--. 1 root root 54284 May 16 16:42 1.txt
-rw-r--r--. 1 root root 103499 May 8 05:53 2.txt
-rw-r--r--. 1 root root 103499 May 8 05:53 3.txt
-rw-r--r--. 1 root root 11 May 15 17:10 4.txt
drwxr-xr-x. 2 root root 18 May 16 17:40 new
[[email protected] tar]# cd /home
[[email protected] home]# tar -czvf all.tar.gz /tar/* && rm -rf /tar/new
tar: Removing leading `/' from member names //试了很多遍也没有把这个警给去掉,没找到原因
/tar/1.txt
/tar/2.txt
/tar/3.txt
/tar/4.txt
/tar/new/
/tar/new/5.txt
[[email protected] home]# tar -xzvf all.tar.gz tar/new/5.txt -C /tar/ && ll /tar
//-C 参数指解压到指定目录, 这个路径是相对于 /home 目录的
tar/new/5.txt
total 268
-rw-r--r--. 1 root root 54284 May 16 16:42 1.txt
-rw-r--r--. 1 root root 103499 May 8 05:53 2.txt
-rw-r--r--. 1 root root 103499 May 8 05:53 3.txt
-rw-r--r--. 1 root root 11 May 15 17:10 4.txt
哎呀大功告成总算完工了,继续研究下一个命令。