如何在首先检查文件夹大小的同时更快地进行 rsync

如何在首先检查文件夹大小的同时更快地进行 rsync

我刚刚在 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(确实如此),特别是可以支持关联数组的 ba​​sh(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

相关内容