首页 > 解决方案 > 备份 bash 脚本和 tar 排除日志和目录

问题描述

以下脚本备份目录 /var/www/websites 中的所有网站,并在 /var/backup 为每个单独的网站创建 .tar.gz 并且工作正常

WEBROOT="/var/www/websites"
BAKPATH="/var/backup"

for vhost in "$WEBROOT"/*; do
  test -d "$vhost" || continue
  base=$(basename "$vhost")
  ( cd "$WEBROOT" && tar -cpzf "$BAKPATH/$(date +%F)_$base.tar.gz" "$base" )
done

但是,我需要从备份中排除日志文件夹和一个网站,就像我们通常用 tar 排除一样

--exclude=$BAKPATH/*/logs 或 --exclude=$BAKPATH/website2.com

我不知道把它放在哪里?我尝试了以下但它不起作用

WEBROOT="/var/www/websites"
BAKPATH="/var/backup"

for vhost in "$WEBROOT"/*; do
  test -d "$vhost" || continue
  base=$(basename "$vhost")
  ( cd "$WEBROOT" && tar -cpzf "$BAKPATH/$(date +%F)_$base.tar.gz --exclude=$BAKPATH/*/logs --exclude=$BAKPATH/website2.com" "$base")
done

我应该放在哪里

--exclude=$BAKPATH/*/logs --exclude=$BAKPATH/website2.com

所以它会影响吗?

标签: linuxbashshellbackup

解决方案


$BAKPATH是应该创建备份过程的目标(存档、*.tgz 文件)的位置。如果要从源中排除某些内容,则必须在中指定路径:

tar -cpz --exclude "$base/logs" \
    -f "$BAKPATH/$(date +%F)_$base.tar.gz" "$base"

这将排除与 glob 模式匹配的所有文件$base/logs(以及下面的所有内容)。

根据您的问题,我假设您要排除例如名为/var/www/websites/cardboardwebshop/logs/access.log. 如果这不正确,请发表评论,也许我们可以弄清楚您需要写什么来排除您想要排除的内容。


推荐阅读