在 bash 循环中似乎无法跳过第四级子目录

在 bash 循环中似乎无法跳过第四级子目录

我编写了一个 bash 脚本,它将循环遍历 /data 目录并备份,然后使用 duplicity 加密所有卷。

我们发现其中一个应用程序正在生成大量我们不需要备份的大文件。所以我想找出一种方法来从脚本中排除这个子目录

backup_volume() { TARGET_DEVICE=$1
    for vol in /data/*; do
        VOLUME=$(basename $vol)
        echo "Backing up $VOLUME on $TARGET_DEVICE/$VOLUME"
        duplicity --file-prefix ${VOLUME}_ --full-if-older 1M /data/$VOLUME $TARGET_DEVICE/$VOLUME --allow-source-mismatch
--encrypt-key "Privbackup" --gpg-options "--batch --pinentry-mode loopback --trust-model always" || ERRORS="$ERRORS $vol>$TARGET_DEVICE"
        duplicity --file-prefix ${VOLUME}_ remove-older-than 1M --force --encrypt-key "Privbackup" --gpg-options "--batch --pinentry-mode loopback --trust-model always" $TARGET_DEVICE/$VOLUME || ERRORS="$ERRORS $vol>$TARGET_DEVICE"
done
}

我曾尝试添加类似的东西

if [$vol = /data/dir1/dir2/dir3/]; then 
continue 
fi

但它似乎没有获取完整的相对目录....救命!

答案1

总结:考虑--exclude从中选择duplicity


/data/*将扩展到中的所有非隐藏文件/data,这意味着它将输出:

/data/file1
/data/file2
/data/dir1
/data/dir2

它不会递归,所以它不会扩展为:

/data/dir1/file1
/data/dir1/dir2

您可以尝试一下printf '%s\n' /data/*

如果您希望它递归,请使用globstar**

shopt -s globstar
for vol in /data/**; done
    [ "$vol" = "/data/dir1/dir2/dir3" ] && continue
    ...
done

# Unset globstar if you want:
shopt -u globstar

无论如何!您应该考虑--exclude来自 的选项duplicity

duplicity --exclude /data/dir1/dir2/dir3

相关内容