tar命令
tar是一个已移植到Linux中的经典UNIX命令。tar是Tape ARchive(磁带归档)的缩写,最初设计用于将文件打包到磁带上。它是一个基于文件的命令,它本质上是连续地、首尾相连地堆放文件。
使用tar可以打包整个目录树,这使得它特别适合用于备份。归档文件可以全部还原,或从中展开单独的文件和目录。备份可以保存到基于文件的设备或磁带设备上。文件可以在还原时重定向,以便将它们重新放到一个与最初保存它们的目录(或系统)不同的目录(或系统)。tar是与文件系统无关的,它可以使用在ext2、ext3、jfs、Reiser和其他文件系统上。
在Linux世界里经常使用tar命令进行备份,此时将涉及tar命令的一些参数。 tar命令的完整格式是:
tar <operation> [options] <files_to_backup_or_restore>
其中:
- operation:用于指定tar要进行的操作
- options:用于指定一系列的选项
- files_to_backup_or_restore:用于给出要备份或要恢复的文件或目录名,在指定目录时也包括了这个目录下的子目录。
下表给出了tar命令的操作说明。
操作 | 说明 |
---|---|
[-]A | 连接多个归档文件为一个归档文件。 |
[-]c | 用于创建一个新的存档文件。 |
[-]x | 从归档文件中恢复备份文件。 |
[-]t | 用于列出一个存档文件中的文件名。 |
[-]u | 仅仅添加比存档文件中更新的文件。即,用新增的文件取代原备份文件,如果在归档文件中找不到要更新的文件,则把它追加到备份文件的最后。 |
[-]d | 将归档文件的内容与文件系统上的当前文件作比较。 |
[-]r | 将文件追加到指定的归档文件中。 |
--delete | 从归档文件中删除指定的文件。 |
下表给出了tar命令的常用选项说明。
选项 | 说明 |
---|---|
-f name | 使用name指定存档文件名或设备名。 |
-v | 列出处理的详细信息。 |
-z | 用GNU的gzip压缩文件或解压。 |
-j | 用GNU的bzip2压缩文件或解压。 |
-C | directory 将当前目录切换到 directory。 |
-M | 创建/列出/恢复多卷存档文件,以便在几个备份介质中存放。 |
-N | DATE 指定仅对那些比DATE新的文件进行操作。 |
-p | 表示希望保留文件许可权限。 |
-P | 保留文件的绝对路径,即不去掉/。 |
-w | 要求等待用户确认每一个操作。 |
-W | 表示在写入备份内容到备份设备以后再读出来进行验证以提高可靠性。 |
-T | filename 从指定的文件中读需要备份或恢复的文件名。 |
-X | filename 不处理给定文件中列出的文件。 |
--exclude=PATTERN | 不处理指定的文件。 |
使用tar备份文件
通常将备份文件存储在单独的分区中,可以是系统本地硬盘中的一个分区,也可以是另外挂装的移动设备中的一个分区。因此,在备份之前,应该创建挂装点目录,并挂装文件系统。
# mkdir /backups # mount -t ext3 /dev/sdc1 /backups # mkdir /backups/logs /backups/last-full
指定要备份的文件或目录
1、使用如下的命令备份指定的一个或多个目录到/backups目录中的一个归档文件
# tar -zcvpf /backups/full-backup.tar.gz /home # tar -zcvpf /backups/full-backup.tar.gz /home /etc
2、使用命令替换生成要备份的目录
下面的命令备份整个/系统,除了mnt、media、dev、proc、backups目录和lost+found目录。
# tar -zcvpf /backups/full-backup.tar.gz -C / \ > $(ls /| egrep -v "backups|mnt|media|dev|lost+found|proc")
3、使用exclude选项剔除无需备份的文件或目录
1) 下面的命令备份整个/系统,除了mnt、media、dev、proc、backups目录和lost+found目录。
# tar -zcvpf /backups/full-backup.tar.gz -C / \ > --exclude=mnt --exclude=media --exclude=dev --exclude=proc \ > --exclude=backups --exclude=*/lost+found \ > --exclude=var/spool/squid > . # 此处的 “.” 表示要备份根目录(因为前面的 “-C /” 将当前目录切换为根目录)
2) 下面的命令备份etc、home、usr/local 和 var/spool(不包括 var/spool/squid) 目录。
# tar -zcvpf /backups/full-backup.tar.gz -C / \ > --exclude=var/spool/squid \ > etc home usr/local var/spool
4、将要备份的文件或目录名放入文本文件
# cat whatsbackup.txt /home /etc /usr/local /root
# tar -zcvpf /backups/full-backup.tar.gz -T whatsbackup.txt
1. -T 参数后指定的文件中,不能使用文件通配符
2. 可以使用 ls 或 find 命令生成 whatsbackup.txt 文件
增量备份
1、使用带 N 选项的 tar 命令实现增量备份
下面的命令将备份/home 目录自 2008-01-29 以来修改过的文件
# tar -N 2008-01-29 -zcvpf /backups/inc-backup_$(date +%F).tar.gz /home
下面的命令将备份 /home 目录昨天以来修改过的文件
# tar -N $(date -d yesterday "+%F") \ > -zcvpf /backups/inc-backup_$(date +%F).tar.gz /home
以下两种书写方式均可,但含义有所不同:
- -N yesterday : 比昨天的当前时间新的文件,例如:若当先时间为 2:31,则表示自昨天 2:31 以来的新文件
- -N $(date -d yesterday ”+%F”) : 自昨天 0:00 以来的新文件
下面的命令使用命令替换从文本文件中获得日期
# tar -N $(cat /backups/last-full/full-backup-date) \ > -zcvpf /backups/inc-backup_$(date +%F).tar.gz /home
/backups/last-full/full-backup-date 是在创建完全备份的同时使用如下命令创建的文件:
date +%F > /backups/last-full/full-backup-date
2、使用 find 命令获取增量备份的文件列表 使用如下命令找出 n 天(如:7天)内修改过的文件,生成备份内容的文件列表
# find /home /etc /root -mtime -7 -print > /backups/logs/inc-backup_$(date +%F).log
对指定文件列表中的文件实现增量备份
# tar -zcvpf /backups/inc-backup_$(date +%F).tar.gz \ > -T /backups/logs/inc-backup_$(date +%F).log