【问题标题】:Backup bash script and tar exclude logs and directory备份 bash 脚本和 tar 排除日志和目录
【发布时间】:2018-12-24 02:14:16
【问题描述】:

以下脚本会备份目录 /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?不应该是像"$vhost/*/logs"这样的东西吗?另请注意,这将作为 模式 给出,因此您必须引用星号的用法。
  • @rkta 是的,我尝试过这样做,但效果不像( cd "$WEBROOT" && tar -cpzf "$BAKPATH/$(date +%F)_$base.tar.gz" "$base" --exclude=$BAKPATH/*/logs --exclude=$BAKPATH/website2.com)
  • @Alfe 你想让我在哪里做这个?像这样:base=$(basename "$vhost/*/logs") 也如何排除多个目录?
  • 在我看来,您正在为 $WEBROOT 中的每个单独站点执行 tar。首先,我将验证 $vhost 不是 website2.com 并且根本不费心去做 tar。其次,您要排除的日志文件应该是 $vhost/logs(没有星号)。
  • @rkta 不,我刚刚尝试过但没有成功,它仍在备份所有内容( cd "$WEBROOT" && tar --exclude=$BAKPATH/*/logs --exclude=$BAKPATH/website2.com -cpzf "$BAKPATH/$(date +%F)_$base.tar.gz" "$base")

标签: linux bash shell backup


【解决方案1】:

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

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

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

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

【讨论】:

  • 我想从所有网站中排除完整的 /var/www/websites/website1.com/logs 目录,以及一个网站本身,即 website2.com 我尝试关注但它也失败了 ( cd "$WEBROOT" && tar -cpzf --exclude "$base/*/logs" --exclude "$base/website1.com" \ -f "$BAKPATH/$(date +%F)_$base.tar.gz" "$base")
【解决方案2】:

在从不同来源获得一些反馈后,我能够通过添加以下带有 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 2014-01-17
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    相关资源
    最近更新 更多