동적으로 생성된 아카이브의 내용 비교

동적으로 생성된 아카이브의 내용 비교

짧은 질문: 동적으로 생성된 두 개의 tar 아카이브가 있습니다(따라서 타임스탬프가 다릅니다). 시간 차이를 무시하고 어떻게 비교합니까?

배경...

나는 스크립트를 사용하여 백업해야 할 항목을 생성하고 디렉터리에 넣은 다음 해당 디렉터리를 tar하고 몇 가지 이전 버전을 유지하는 일부 백업을 수행하고 있습니다. 작업 시간이 손실되지 않도록 하려면 백업 스크립트를 30분마다 실행해야 합니다.

이제 데이터가 변경되지 않는 특정 기간이 있으므로 동일한 콘텐츠의 복사본을 반복해서 저장할 필요가 없다는 것을 깨달았습니다. 저장하기 전에 아카이브를 비교하고 싶습니다. 내 시도는 새 데이터가 포함될 때만 실행 cmp newdata.tar.gz olddata.tar.gz하고 저장하는 것입니다. newdata.tar.gz분명히 이것은 타임 스탬프가 다르기 때문에 작동하지 않습니다.

답변1

이를 수행하는 세 가지 방법이 있습니다. 첫 번째는 내 취향이다.

파일 생성 프로세스 변경

dump_table foo >foo.dump이전 파일이 새 파일과 동일한 경우 파일을 무분별하게 재생성하는 대신 이전 파일을 유지합니다( ).

dump_table foo >foo.dump.new
if cmp foo.dump foo.dump.new; then
  rm foo.dump.new
else
  mv foo.dump.new foo.dump
fi

파일을 디렉터리로 마운트

사용AVFS#모든 아카이브에는 아카이브 내용을 보유하는 것으로 보이는 연관된 디렉토리(동일한 이름, 끝에 추가됨) 가 있는 전체 디렉토리 계층 구조의 보기를 생성합니다 .

mountavfs
d=$(date -d %Y%m%d%H%M%S); mkdir $d; tar czf /path/to/$d.tgz $d; rmdir $d
cd /path/to/back/up
rsync -ac --compare-dest=~/.avfs/path/to/yesterday.tgz . ~/.avfs/path/to/$d.tgz

필요한 기능을 갖춘 백업 도구를 사용하세요

백업 절차는 매우 안정적이어야 합니다. 국내 솔루션이 모든 상황을 커버하기는 어렵습니다. 따라서 완전한 백업 프로그램을 고려하십시오. 제 생각에는이중성필요한 작업을 수행합니다. 증분 백업을 수행하고 rsync 알고리즘을 사용하므로 이미 존재하는 데이터에 공간을 낭비해서는 안 됩니다.

답변2

backup2l한 가지 옵션은 예를 들어 모든 수준의 차등 백업과 원하는 수의 전체 백업에 대해 구성할 수 있는 백업 도구를 사용하는 것입니다 . backup2l원하는 빈도로 cronjob으로 실행하고 conf 파일에 대한 일부 값을 설정하여 구성하십시오. 실제로는 변경 사항을 찾기 위해 해시가 포함된 파일 목록을 유지하고 상태를 확인하거나 날짜별로 파일을 복원하는 쉬운 방법을 제공하는 tar 또는 afio를 둘러싼 래퍼입니다.

두 번째 옵션은 cvs. 자동 커밋(및 매일 태그 지정)을 수행하도록 cronjob을 설정합니다. VCS 선택에 따라 새 파일을 추가하거나 이전 파일을 삭제하기 위해 일부 스크립트가 필요할 수 있습니다.svngit

30분 간격으로 vcs 옵션을 사용하는 것이 좋습니다. 그러나 (또는 ​​다른 백업 도구)를 사용하여 두 도구를 결합하여 backup2lvcs 저장소를 백업할 수 있습니다(백업 중복성은 항상 좋습니다).

답변3

아카이브의 파일이 변경되었습니까, 아니면 새 파일이 추가되었습니까?

파일을 변경하지 않고 파일만 추가하는 경우 다음을 시도해 보세요.

tar ztf olddata.tar.gz | sort > tmpfile1
tar ztf newdata.tar.gz | sort > tmpfile2
diff tmpfile{1,2} > /dev/null
if test $? -eq 0
then
  echo ignore newdata.tar.gz
else
  echo keep olddata.tar.gz
fi
rm tmpfile{1,2}

vtar 디렉터리 명령이 누락되었습니다 .

동일한 콘텐츠가 포함된 아카이브만 건너뛰려면 v다음과 같이 믹스에 를 추가하세요.

tar ztvf olddata.tar.gz | sort > tmpfile1

등.

답변4

그러니 이것을 시도해 보세요:

OLDSUM=`tar zxOf olddata.tar.gz | md5sum | awk '{print $1}'`
NEWSUM=`tar zxOf newdata.tar.gz | md5sum | awk '{print $1}'`
if test "${NEWSUM}" != "${OLDSUM}"
then
  echo save newdata.tar.gz
else
  echo nothing changed
fi

Capital은 O아카이브 콘텐츠를 stdout.

그러나 파일이 정확히 동일한 순서로 아카이브에 추가되지 않으면 작동하지 않습니다(그럴 수도 있음).

관련 정보