[译] Linux 中 18 个 tar 命令示例

Linux 中 “tar” 是 tape archive(磁带归档)的缩写,起初经常被 Linux/Unix 系统管理员用来做磁带驱动器的备份。在 Linux 中 tar 命令用来将一些文件和目录变成高度压缩存档文件,这种文件一般是 tarball、tar、gzip 或者 bzip。人们通常用 tar 命令创建压缩存档文件以便在硬盘和机器之间移动复制。

在这篇文章中我将讲述讨论不同的 tar 命令示例,包括怎么用(tar、tar.gz 和 tar.bz2)压缩算法创建存档文件、怎么解压存档文件、在存档文件中解压出单个文件、查看存档文件的目录、添加文件或目录到存档文件中、在归档文件中删除文件等等。

这篇文章的主要目的是提供各种 tar 命令示例帮助大家理解 tar 存档的方法。

创建tar存档文件

下面命令示例将在当前目录在为 /home/tecmint 目录创建名为 tecmint-14-09-12.tartar 存档文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# tar cvf tecmint-14-09-12.tar /home/tecmint/
/home/tecmint/
/home/tecmint/cleanfiles.sh
/home/tecmint/openvpn-2.1.4.tar.gz
/home/tecmint/tecmint-14-09-12.tar
/home/tecmint/phpmyadmin-2.11.11.3-1.el5.rf.noarch.rpm
/home/tecmint/rpmforge-release-0.5.2-2.el5.rf.i386.rpm
## If you want create tar file from multiple file
# tar cvf backup.tar johnnyshieh.png ubuntu_config.txt
johnnyshieh.png
ubuntu_config.txt

让我们来讨论下上面用到的几个参数的含义。

c :创建新的 .tar 存档文件

v :详细显示存档 .tar 文件的进度

f :指定存档文件的文件名

创建 tar.gz 存档文件

要创建一个 gzip 压缩存档文件我们需要用到 z 参数。下面命令示例中将为 /home/MyImages 目录创建名为 MyImages-14-09-12.tar.gz 的存档文件。(注意:tar.gz 和 tgz 是等价的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# tar cvzf MyImages-14-09-12.tar.gz /home/MyImages
OR
# tar cvzf MyImages-14-09-12.tgz /home/MyImages
/home/MyImages/
/home/MyImages/Sara-Khan-and-model-Priyanka-Shah.jpg
/home/MyImages/RobertKristenviolent101201.jpg
/home/MyImages/Justintimerlakenaked101125.jpg
/home/MyImages/Mileynudephoto101203.jpg
/home/MyImages/JenniferRobert101130.jpg
/home/MyImages/katrinabarbiedoll231110.jpg
/home/MyImages/the-japanese-wife-press-conference.jpg
/home/MyImages/ReesewitherspoonCIA101202.jpg
/home/MyImages/yanaguptabaresf231110.jpg

创建 tar.bz2 存档文件

bz2 压缩算法创建的压缩存档文件比 gzip 更小。相应的,bz2 压缩算法在压缩和解压文件时也要更多的时间。创建高度压缩的 bz2 存档文件我们需要用参数 j。下面的示例将为 /home/php 目录创建名为 Phpfiles-org.tar.bz2 的存档文件。(注意:tar.bz2、tbz 和 tb2 是等价的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# tar cvfj Phpfiles-org.tar.bz2 /home/php
OR
# tar cvfj Phpfiles-org.tar.tbz /home/php
OR
# tar cvfj Phpfiles-org.tar.tb2 /home/php
/home/php/
/home/php/iframe_ew.php
/home/php/videos_all.php
/home/php/rss.php
/home/php/index.php
/home/php/vendor.php
/home/php/video_title.php
/home/php/report.php
/home/php/object.html
/home/php/video.php

解压 tar 存档文件

如果要解压一个 tar 文件,只需要用 x 参数。下面示例中将把 public_html-14-09-12.tar 文件到当前工作目录。如果你想解压到不同的的目录,只要用 -C 参数就可以你。

1
2
3
4
5
6
7
8
9
10
11
12
## Untar files in Current Directory ##
# tar xvf public_html-14-09-12.tar
## Untar files in specified Directory ##
# tar xvf public_html-14-09-12.tar -C /home/public_html/videos/
/home/public_html/videos/
/home/public_html/videos/views.php
/home/public_html/videos/index.php
/home/public_html/videos/logout.php
/home/public_html/videos/all_categories.php
/home/public_html/videos/feeds.xml

解压 tar.gz 存档文件

要解压 tar.gz 存档文件,只要运行下面的命令。如果你想解压到其他的目录只要用 -C 参数指定目录的路径,像上一个示例中一样。

1
2
3
4
5
6
7
8
9
10
11
12
# tar xvf thumbnails-14-09-12.tar.gz
/home/public_html/videos/thumbnails/
/home/public_html/videos/thumbnails/katdeepika231110.jpg
/home/public_html/videos/thumbnails/katrinabarbiedoll231110.jpg
/home/public_html/videos/thumbnails/onceuponatime101125.jpg
/home/public_html/videos/thumbnails/playbutton.png
/home/public_html/videos/thumbnails/ReesewitherspoonCIA101202.jpg
/home/public_html/videos/thumbnails/snagItNarration.jpg
/home/public_html/videos/thumbnails/Minissha-Lamba.jpg
/home/public_html/videos/thumbnails/Lindsaydance101201.jpg
/home/public_html/videos/thumbnails/Mileynudephoto101203.jpg

解压 tar.bz2 存档文件

其实从上面两个示例中可以看出,解压 tartar.gz 存档文件,所用的命令是一样,解压 tar.bz2 文件也是一样,tar 命令会根据存档文件的类型自动选择解压算法解压。

1
2
3
4
5
6
7
8
9
10
# tar xvf videos-14-09-12.tar.bz2
/home/public_html/videos/flv/katrinabarbiedoll231110.flv
/home/public_html/videos/flv/BrookmuellerCIA101125.flv
/home/public_html/videos/flv/dollybackinbb4101125.flv
/home/public_html/videos/flv/JenniferRobert101130.flv
/home/public_html/videos/flv/JustinAwardmovie101125.flv
/home/public_html/videos/flv/Lakme-Fashion-Week.flv
/home/public_html/videos/flv/Mileynudephoto101203.flv
/home/public_html/videos/flv/Minissha-Lamba.flv

列出 tar 归档文件中的内容

要列出 tar 归档文件中的内容,只需运行下面命令时加上 t 参数。下面的命令将列出 uploadprogress.tar 文件的内容。

1
2
3
4
5
6
7
8
9
10
11
# tar tvf uploadprogress.tar
-rw-r--r-- chregu/staff 2276 2011-08-15 18:51:10 package2.xml
-rw-r--r-- chregu/staff 7877 2011-08-15 18:51:10 uploadprogress/examples/index.php
-rw-r--r-- chregu/staff 1685 2011-08-15 18:51:10 uploadprogress/examples/server.php
-rw-r--r-- chregu/staff 1697 2011-08-15 18:51:10 uploadprogress/examples/info.php
-rw-r--r-- chregu/staff 367 2011-08-15 18:51:10 uploadprogress/config.m4
-rw-r--r-- chregu/staff 303 2011-08-15 18:51:10 uploadprogress/config.w32
-rw-r--r-- chregu/staff 3563 2011-08-15 18:51:10 uploadprogress/php_uploadprogress.h
-rw-r--r-- chregu/staff 15433 2011-08-15 18:51:10 uploadprogress/uploadprogress.c
-rw-r--r-- chregu/staff 1433 2011-08-15 18:51:10 package.xml

列出 tar.gz 存档文件的内容

用下面的命令就可以列出 tar.gz 文件的内容。

1
2
3
4
5
6
7
8
9
10
11
12
# tar tvf staging.tecmint.com.tar.gz
-rw-r--r-- root/root 0 2012-08-30 04:03:57 staging.tecmint.com-access_log
-rw-r--r-- root/root 587 2012-08-29 18:35:12 staging.tecmint.com-access_log.1
-rw-r--r-- root/root 156 2012-01-21 07:17:56 staging.tecmint.com-access_log.2
-rw-r--r-- root/root 156 2011-12-21 11:30:56 staging.tecmint.com-access_log.3
-rw-r--r-- root/root 156 2011-11-20 17:28:24 staging.tecmint.com-access_log.4
-rw-r--r-- root/root 0 2012-08-30 04:03:57 staging.tecmint.com-error_log
-rw-r--r-- root/root 3981 2012-08-29 18:35:12 staging.tecmint.com-error_log.1
-rw-r--r-- root/root 211 2012-01-21 07:17:56 staging.tecmint.com-error_log.2
-rw-r--r-- root/root 211 2011-12-21 11:30:56 staging.tecmint.com-error_log.3
-rw-r--r-- root/root 211 2011-11-20 17:28:24 staging.tecmint.com-error_log.4

列出 tar.bz2 存档文件的内容

和上面两个示例所用的命令一样。

1
2
3
4
5
6
7
8
9
10
11
# tar tvf Phpfiles-org.tar.bz2
drwxr-xr-x root/root 0 2012-09-15 03:06:08 /home/php/
-rw-r--r-- root/root 1751 2012-09-15 03:06:08 /home/php/iframe_ew.php
-rw-r--r-- root/root 11220 2012-09-15 03:06:08 /home/php/videos_all.php
-rw-r--r-- root/root 2152 2012-09-15 03:06:08 /home/php/rss.php
-rw-r--r-- root/root 3021 2012-09-15 03:06:08 /home/php/index.php
-rw-r--r-- root/root 2554 2012-09-15 03:06:08 /home/php/vendor.php
-rw-r--r-- root/root 406 2012-09-15 03:06:08 /home/php/video_title.php
-rw-r--r-- root/root 4116 2012-09-15 03:06:08 /home/php/report.php
-rw-r--r-- root/root 1273 2012-09-15 03:06:08 /home/php/object.html

在 tar 文件中解压单个文件

cleanfiles.sh.tar 中解压 cleanfiles.sh 文件,用下面的命令即可。

1
2
3
4
5
# tar xvf cleanfiles.sh.tar cleanfiles.sh
OR
# tar --extract --file=cleanfiles.sh.tar cleanfiles.sh
cleanfiles.sh

在 tar.gz 文件中解压单个文件

tecmintbackup.tar.gz 存档文件中解压 tecmintbackup.xml 文件,用下面的命令即可。

1
2
3
4
5
# tar zxvf tecmintbackup.tar.gz tecmintbackup.xml
OR
# tar --extract --file=tecmintbackup.tar.gz tecmintbackup.xml
tecmintbackup.xml

在 tar.bz2 文件中解压单个文件

Phpfiles-org.tar.bz2 文件中解压 index.php 文件。

1
2
3
4
5
# tar jxvf Phpfiles-org.tar.bz2 home/php/index.php
OR
# tar --extract --file=Phpfiles-org.tar.bz2 /home/php/index.php
/home/php/index.php

在 tar、tar.gz 或 tar.bz2 文件中解压多个文件

如何在 tartar.gztar.bz2 解压多个文件。如下面示例中从存档文件中解压 file1file2 两个文件。

1
2
3
4
5
# tar xvf tecmint-14-09-12.tar "file1" "file2"
# tar zxvf MyImages-14-09-12.tar.gz "file1" "file2"
# tar jxvf Phpfiles-org.tar.bz2 "file1" "file2"

用通配符解压一组文件

我们可以用 wildcard (通配符)解压一组文件。如下面的示例中,从 tartar.gztar.bz2 存档文件中解压出文件名是以 .php 结束的一组文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# tar -xvf Phpfiles-org.tar --wildcards '*.php'
# tar -zxvf Phpfiles-org.tar.gz --wildcards '*.php'
# tar -jxvf Phpfiles-org.tar.bz2 --wildcards '*.php'
/home/php/iframe_ew.php
/home/php/videos_all.php
/home/php/rss.php
/home/php/index.php
/home/php/vendor.php
/home/php/video_title.php
/home/php/report.php
/home/php/video.php

添加文件或目录到 tar 归档文件中

要添加文件或目录到已存在的tar归档文件中,我们需要用参数 r (append。下面示例中我们将添加 xyz.txt 文件和 php 目录到 tecmint-14-09-12.tar 归档文件中。

1
2
3
4
5
6
7
8
9
10
11
12
13
# tar -rvf tecmint-14-09-12.tar xyz.txt
# tar -rvf tecmint-14-09-12.tar php
-rw-r--r-- root/root 0 2012-08-18 19:11:04 xyz.txt
drwxr-xr-x root/root 0 2012-09-15 03:06:08 php/
-rw-r--r-- root/root 1751 2012-09-15 03:06:08 php/iframe_ew.php
-rw-r--r-- root/root 11220 2012-09-15 03:06:08 php/videos_all.php
-rw-r--r-- root/root 2152 2012-09-15 03:06:08 php/rss.php
-rw-r--r-- root/root 3021 2012-09-15 03:06:08 php/index.php
-rw-r--r-- root/root 2554 2012-09-15 03:06:08 php/vendor.php
-rw-r--r-- root/root 406 2012-09-15 03:06:08 php/video_title.php

添加文件或目录到 tar.gz 或 tar.bz2 文件中

tar 命令没有添加文件或目录到 tar.gztar.bz2 文件中的参数。如果你尝试则会提示下面的错误。

1
2
3
4
5
6
# tar -rvf MyImages-14-09-12.tar.gz xyz.txt
# tar -rvf Phpfiles-org.tar.bz2 xyz.txt
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now

删除 tar 归档文件中的文件

在 tar 归档文件中删除文件,要用到 –delete 参数。下面示例中删除 tecmin-14-09-12.tar 文件中的 cleanfile.sh

1
2
3
4
# tar f tecmin-14-09-12.tar --delete cleanfile.sh
## If you want delete multiple files
# tar f tecmin-14-09-12.tar --delete cleanfile.sh config.txt

删除 tar.gz 或 tar.bz2 归档文件中的文件

tar 命令没有提供删除 tar.gztar.bz2 归档文件中的文件的参数,如果你尝试则会得到如下错误。

1
2
3
4
5
6
# tar f backup.tar.gz --delete johnnyshieh.png
# tar f backup.tar.bz2 --delete johnnyshieh.png
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now

Tar 命令参数说明

c :创建归档文件

x :解压归档文件

v :显示命令执行的进度

f :指定归档文件的名字

t :列出归档文件的内容

z :用 gzip 过滤存档

j :用 bzip2 过滤存档

r :添加或更新归档文件中的文件或目录

wildcards :指定通配符模式

delete :指定删除文件或目录

最后希望通过以上的 Tar命令示例 可以让大家基本了解 tar 命令的使用,如果要了解更多信息请使用 man tar 命令。如果你有什么好的的命令示例或者文章有什么需要改正的地方欢迎通过评论告诉我。

原文链接TecMint.com

END
Johnny Shieh wechat
我的公众号,不只有技术,还有咖啡和彩蛋!