저는 각각 총 크기가 수 기가바이트에 달하는 여러 디렉터리/웹 사이트 리소스를 가지고 있습니다. 그들은 90% 이상 동일합니다. 때로는 몇 개의 파일만 수정되기도 합니다.
백업을 위해 정기적으로 이러한 파일을 다운로드해야 합니다. 저장공간은 문제가 되지 않으나 다운로드 시간이 너무 깁니다.
원하는 것은
다음과 같은 디렉토리를 참조(d1)로 사용하는 것입니다.
1. 다른 디렉터리(d2)의 경우 d1과 d2 사이의 동일한 파일을 모두 나열하고 common.txt에 저장합니다. 동일은 상대 경로(d1 및 d2 내), 파일 이름 및 콘텐츠가 동일하며 소유자/그룹 및 타임스탬프를 무시함을 의미합니다.
2. d1에 존재하지 않는 d2의 모든 파일(이종 파일 포함)을 d3에 복사합니다.
그런 다음 tarballed d1, d3 및 common.txt를 다른 컴퓨터에 다운로드했습니다.
d3을 d2에 복사합니다.
3. common.txt에 나열된 파일을 d1에서 d2로 복사합니다.
(1), (2), (3) 단계를 해결하는 방법을 제안해 주실 수 있나요?
답변1
중복 제거를 고려하세요. 새 파일을 삭제하고 업로드하는 대신 서버에서 이러한 파일을 직접 수정할 수 있는 방법이 있습니까? 그렇지 않은 경우 동일한 파일을 직접 심볼릭 링크하거나 하드링크할 수 있습니다. 이렇게 하면 서버의 저장 공간이 절약되고 rsync -H
지원되는 하드 링크를 사용할 때 다운로드 문제가 자동으로 해결됩니다. 하드 링크 트랩(하나를 내부 수정하면 실제로 동일한 파일이기 때문에 모두 수정됨)을 알고 있는 한 이것이 가장 좋은 솔루션입니다.
fdupes
이를 사용하여 중복 파일을 효율적으로 찾을 수 있습니다 . 여기에는 콘텐츠 측면의 중복이 포함되지만 안타깝게도 파일 이름에 대한 요구 사항은 없습니다. 이것을 사용한 다음 중복된 파일 이름 목록을 필터링하거나 직접 비교할 수 있습니다. 사용 find
, stat
, cmp
.
완전히 개선되지 않은 예:
cd d1
find -type f -exec ./compare.sh d1/{} d2/{}
비교.sh:
if [ -f "$1" -a -f "$2" ]
then
asize=`stat -c%s "$1"`
bsize=`stat -c%s "$2"`
if [ "$asize" == "$bsize" ]
then
if cmp "$1" "$2"
then
echo IDENTICAL "$1" "$2"
else
echo DIFFERENT "$1" "$2"
fi
fi
fi
타르볼을 언급했으므로 이를 포함/제외 파일 목록에 표시하여 tar --files-from / --exclude-from
.