폴더 크기를 먼저 확인하면서 더 빠르게 재동기화하는 방법

폴더 크기를 먼저 확인하면서 더 빠르게 재동기화하는 방법

방금 Mac에서 Automator를 사용하여 다음과 같은 간단한 쉘 스크립트를 작성했습니다.

rsync -a --delete "/Volumes/Backup Plus/photo" "/Volumes/My Passport/photo"
rsync -a --delete "/Volumes/Backup Plus/video" "/Volumes/My Passport/video"

기본적으로 외부 드라이브의 일부 폴더를 다른 드라이브로 백업합니다.

이 시점에서 두 드라이브의 내용은 완전히 동일하지만 "rsync"는 심층적인 재귀 비교를 수행하기 때문에 여전히 시간이 오래 걸립니다. (사진, 동영상 폴더 모두 1TB 이상입니다.)

크기가 변경된 폴더만 백업하도록 선택할 수 있습니까?이렇게 하면 rsync에 몇 초밖에 걸리지 않습니다. 먼저 상위 폴더의 크기인 74.921.434바이트를 확인한다고 생각합니다. 그리고 비교해 보세요. 치수는 동일합니다. 아무 작업도 수행할 필요가 없으므로 스크립트의 다음 줄로 바로 이동합니다. 등..

나는 그것이 같은 것이 아니라는 것을 알고 있으며 그것이 백업이 아니라는 것을 알고 있습니다. 최악의 경우 일부 변경 사항은 여전히 ​​동일한 크기로 끝날 수 있지만 여전히 그럴 가능성은 매우 낮습니다. 원래의 deep 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

쉘이 실제로 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

관련 정보