我创建了以下 bash 脚本,用于在 cron 中自动备份某些文件夹,同时排除某些子文件夹:
folders_to_backup=(
"/first/folder/to/backup/"
"/second/folder/to/backup/"
)
backup_temp="/home/myuser/temp_backup_folder/"
mkdir $backup_temp
for i in "${folders_to_backup[@]}"
do
cp -r $i $backup_temp
done
find $backup_temp | tar -czf "/home/myuser/backup.tgz" -T - -- exclude=*/venv --exclude=*/__pycache__
rm -r $backup_temp
所以基本上我正在做的就是创建一个临时文件夹,然后将我想要备份的所有相关内容复制到该文件夹中。然后我压缩该文件夹(同时排除某些子文件夹)并将其保存在其他位置。然后我删除临时文件夹。
将所有内容复制到临时文件夹中都可以正常工作。但是,当我打开 tar 文件时,它包含每个文件的多个重复项。例如,如果我备份了一个名为test.txt
then 的文件,该文件将位于临时目录中。但是,当查看 tar 文件时,会发现有多个副本test.txt
我似乎无法弄清楚临时文件夹到 tar 之间发生了什么。我愿意接受纠正上述问题的建议或有关如何在不使用临时文件夹的情况下执行此操作的建议。
答案1
您需要使用tar --no-recursion
or ,find ... ! -type d
因为每次您的 find 列出一个目录时, tar 都会递归地复制所有目录。
另外,您不能简单地避免复制并-C dir .
为数组中的每个目录执行 a 操作吗,例如:
args=()
for f in "${folders_to_backup[@]}"
do args+=("-C" "$f" ".")
done
tar -czf "/home/myuser/backup.tgz" "${args[@]}" --exclude ...
答案2
我想你所需要的只是rsync
例如:
$ rsync -auxnv -T /temp/dir --exclude={"/dir/1","/dir/2",...} \
/source/file user@host:/dest/dir/
还有一个在传输过程中进行压缩的选项,-z
请阅读man rsync
查看这个也是。