我刚刚在 Mac 上使用 Automator 编写了一个简单的 shell 脚本,如下所示:
rsync -a --delete "/Volumes/Backup Plus/photo" "/Volumes/My Passport/photo"
rsync -a --delete "/Volumes/Backup Plus/video" "/Volumes/My Passport/video"
它基本上将一些文件夹从外部驱动器备份到另一个驱动器。
此时,两个驱动器具有完全相同的内容,但“rsync”仍然需要很长时间,因为据我了解,它进行了深度递归比较。 (照片和视频文件夹均大于 1 TB)
我是否可以选择仅对大小已更改的文件夹进行备份?这样 rsync 只需要几秒钟。我想象一下,它首先检查父文件夹的大小,74.921.434 字节。并进行比较。尺寸相同。并直接跳到脚本中的下一行,因为不需要执行任何操作。等等..
我知道这不是同一件事,我知道它不是备份。在最坏的情况下,某些更改仍然可能以完全相同的大小结束,但是,这仍然是非常非常不可能的。我仍然可以拥有原来的深度 rsync 备份脚本,并像每月一次或......运行一次。但是使用第二个更快的脚本,我每天备份所需的时间将大大减少。这有道理吗?
答案1
您可以检查尺寸du
,然后比较它们:
#!/bin/sh
pic_source_dir="/Volumes/Backup Plus/photo/"
pic_dest_dir="/Volumes/My Passport/photo/"
vid_source_dir="/Volumes/Backup Plus/video"
vid_dest_dir="/Volumes/My Passport/video"
if [ "$(du "$pic_source_dir")" -ne "$(du "$pic_dest_dir")" ]; then
rsync -a --delete "$pic_source_dir" "$pic_dest_dir"
fi
if [ "$(du $vid_source_dir)" -ne "$(du "$vid_dest_dir")" ]; then
rsync -a --delete "$vid_source_dir" "$vid_dest_dir"
fi
如果你的 shell 实际上是 bash(确实如此),特别是可以支持关联数组的 bash(macos 上的默认 bash不是),你可以清理一下:
#!/usr/bin/env bash
declare -A backup_dirs
backup_dirs=(
["/Volumes/Backup Plus/photo/"]="/Volumes/My Passport/photo/"
["/Volumes/Backup Plus/video"]="/Volumes/My Passport/video"
)
for src in "${!backup_dirs[@]}"; do
dst="${backup_dirs["$src"]}"
if [[ "$(du "$src")" -ne "$(du "$dst")" ]]; then
rsync -a --delete "$src" "$dst"
fi
done
使用 Macos 中的 bash v3.2,您仍然可以使用间接变量扩展来稍微清理它:
#!/bin/bash
pic_src="/Volumes/Backup Plus/photo/"
pic_dst="/Volumes/My Passport/photo/"
vid_src="/Volumes/Backup Plus/video"
vid_dst="/Volumes/My Passport/video"
for i in pic vid; do
t1="${i}_src"
t2="${i}_dst"
src=${!t1}
dst=${!t2}
if [[ "$(du "$src")" -ne "$(du "$dst")" ]]; then
rsync -a --delete "$src" "$dst"
fi
done