如何进行选择性备份?

如何进行选择性备份?

假设有一个名为domainsin 的文件夹glassfish。它有domain1domain2...。domainN

我想从domain1目录中取出所有内容logs并将它们保存到/home/user/backup目录中。

我可以手动执行此操作,

cp -R /home/user/glassfish/domains/domain1 /home/user/backup
rm -rf /home/user/backup/domain1/logs

但我怎样才能更轻松地做到这一点呢?

答案1

您可以使用rsync代替cp.除了有一个排除选项外,本地到本地副本的基本相同

rsync --archive --exclude /logs /home/user/glassfish/domains/domain1 /home/user/backup

答案2

您可以使用该cp命令并排除包含日志的文件夹,!(excluded_folder)如果您不想使用rsynctar

cp -var /home/user/glassfish/domains/domain1/!(/home/user/backup/domain1/logs) /home/user/backup

或者

cp -R /home/user/glassfish/domains/domain1/!(/home/user/backup/domain1/logs) /home/user/backup

如果你想排除更多文件夹,你可以使用|类似的 !(excluded_folder1|excluded_folder2|excluded_folder3)

确保您的 shell 支持扩展模式匹配(例如,extglob启用该选项的 Bash)。

如果你想在 bash 脚本中使用它:

#!/bin/bash
shopt -s extglob
cp -var /home/user/glassfish/domains/domain1/!(/home/user/backup/domain1/logs) /home/user/backup

如果您收到类似错误!": event not found"

检查这个帖子:

什么是“-bash:!”: 未找到事件”

答案3

您可以使用ziptar来制作存档副本:

cd /home/user/glassfish/domains/domain1
tar --exclude="logs" cvf /home/user/backup/domain1.tar .

等等。或者与zip

cd /home/user/glassfish/domains/domain1
zip /home/user/backup/domain1.zip  -x logs/**\* .

通过这种方式,您可以根据日期命名档案,这样您就可以在那里保留记录的历史记录。

答案4

如果您不能依赖 shell 语法,您可以使用findcpio传递模式:

find SOURCE \( -depth 1 -name logs -prune \) -o \( -type f -print0 \) |
cpio -p -v -0 -d DESTINATION

以下cpio选项可能更令人感兴趣(如果您的实现支持它们):

  • -a, --reset-access-time– 读取文件后重置文件的访问时间。

  • -m, --preserve-modification-time– 设置创建的文件的文件修改时间以匹配源中的文件修改时间。

  • --no-preserve-owner– 不要尝试恢复文件所有权。这是非 root 用户运行时的默认设置。

  • -R [user][:][group], --owner [user][:][group]– 设置输出中文件的所有者和/或组。 [...] 该选项只能由超级用户使用。

  • -u, --unconditional– 无条件覆盖现有文件。通常,旧文件不会覆盖磁盘上的新文件。

相关内容