备份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

所以它会生效吗?

$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的文件。如果这不正确,请发表评论,也许我们可以弄清楚你到底需要写什么来排除你想排除的内容。

在从不同来源获得一些反馈后,我能够通过添加以下带有if条件的行来实现这一点

##ADD THIS
if [[ $vhost = *"website1.com"* || $vhost = *"website2.co.uk"* ]]; then
continue
fi
##

所以,最后脚本看起来像这个

WEBROOT="/var/www/websites"
BAKPATH="/var/backup"
for vhost in "$WEBROOT"/*; do
test -d "$vhost" || continue
if [[ $vhost = *"website1.com"* || $vhost = *"website2.co.uk"* ]]; then
continue
fi
base=$(basename "$vhost")
( cd "$WEBROOT" && tar -cpzf "$BAKPATH/$(date +%F)_$base.tar.gz" "$base" )
done