我需要创建一个脚本,也许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`