从省略一些子目录的目录创建 .tar.gz 并仅添加新的或更改的文件

从省略一些子目录的目录创建 .tar.gz 并仅添加新的或更改的文件

我需要创建一个脚本,也许bash,也许只是一个.sh检查根目录和根子目录上的文件更改,并添加到新文件的脚本。 tar.gz 文件名末尾应包含创建日期(例如monitor-17.06.2013.tar.gz)。我做的:

tar -zcvf /home/monitor.tar.gz /var/www/html/monitor --exclude /var/www/html/monitor/cache /var/www/html/monitor/log

它可以工作,但目录/var/www/html/monitor/log没有被省略,文件名不包含日期,并且缺少仅添加新文件或更改文件的部分,因为我不知道该怎么做。

编辑:澄清一下我的需求 好的,由于这里用户的一些评论,我会尝试留下我正在寻找的内容。

Day1: 2013-06-15
Directory: /var/www/html/monitor
Backup File Created: monitor-2013-06-15.tar.gz (contains all the content of /monitor folder)

Day2: 2013-06-16
Directory: /var/www/html/monitor
Files Changed: 
  /var/www/html/monitor/file1.php
  /var/www/html/monitor/log/file2.php
  /var/www/html/monitor/web/file3.php

Files Added: 
  /var/www/html/monitor/index.php
Backup File Created: monitor-2013-06-16.tar.gz (contains **only** the files index.php, file1.php, file2.php and file3.php)

Day3: 2013-06-17
Directory: /var/www/html/monitor
Files Changed: 
  /var/www/html/monitor/index.php
Backup File Created: monitor-2013-06-17.tar.gz (contains **only** the file index.php)

第一个备份始终包含所有内容,但其余备份应该只包含修改的文件和最新的文件,没有其他内容。

答案1

要在文件名中插入当前日期,请date命令替换

tar -czf monitor-$(date -d %Y-%m-%d).tar.gz …

我建议对日期使用年月日格式,原因如下:字典顺序与时间顺序相匹配;美国的月-日-年和世界其他地区的日-月-年之间不存在混淆的风险;这是一个 ISO 标准。

要排除多个目录,您需要--exclude对每个目录重复:如果您编写tar -czf monitor.tar.gz --exclude dir1 dir2,则dir2是要包含在存档中的路径,仅dir1是 的参数--exclude

tar -czf monitor-$(date -d %Y-%m-%d).tar.gz --exclude /var/www/html/monitor/cache /var/www/html/monitor/log /var/www/html/monitor

要存储在特定日期之后修改的文件,请传递该--newer选项。您可以指定参考文件或日期。使用时间戳文件要可靠得多:在每次备份之前创建该文件,并使用上一个备份中的时间戳文件作为下一个备份的参考。

touch monitor-backup.timestamp.new
tar … --newer=./monitor-backup.timestamp
mv -f monitor-backup.timestamp.new monitor-backup.timestamp

您似乎正在滚动自己的增量备份系统。可靠地做到这一点是非常困难的。我建议使用现有的备份应用程序,例如表里不一

答案2

至于省略的目录,您必须--exclude对每个目录使用该选项,这并不意味着它排除其后的所有内容。某些命令将采用逗号分隔值,但不是全部。

tar -zcvf /home/monitor.tar.gz /var/www/html/monitor --exclude /var/www/html/monitor/cache --exclude /var/www/html/monitor/log

至于附加日期的部分,根据您对要查找的内容的解释,我认为您可以使用:

-d, --diff, --compare
      find differences between archive and file system

编辑:这是一个快速的小脚本来执行此操作。没有错误检查或任何东西,但这是一个开始。

NEW_FILE="monitor.`date +%d.%m.%Y`.tar.gz"
PREV_FILE={However you want to find this}

tar cf $NEW_FILE `tar --diff -f $PREV_FILE  | awk --field-separator=: '{print $1}' | uniq`

相关内容