답변:
이 방법은 tar 아카이브를 다시 만들고 완성 된 부분을 기존 파일에 추가합니다. 네트워크 연결을 통해 백업 할 때 유용 할 수 있습니다. INFILES의 데이터가 변경된 경우 아카이브가 손상 될 수 있습니다. 완료 후 아카이브를 테스트하십시오.
다음 줄에서 INFILES 및 OUTFILE을 올바른 이름으로 변경하십시오.
INFILES="my folder"; OUTFILE="archive.tgz"; SIZE="$(wc -c < $OUTFILE)"; tar -cz --to-stdout "$INFILES" | tail -c +$(($SIZE+1)) >> "$OUTFILE"
설명:
SIZE="$(wc -c < $OUTFILE)"
# 아카이브의 현재 크기를 가져옵니다.
tar -cz --to-stdout "$INFILES" |
# 아카이브 생성을 시작하고 출력을 tail
명령으로 보냅니다 .
tail -c +$(($SIZE+1)) >>
# $ SIZE + 1 이전의 데이터를 무시하고 나머지 $ OUTFILE 아카이브를 재개하십시오.
가장 좋은 해결책은 tar 파일을 삭제하고 접두사가 붙고 추가 nohup
된 프로세스를 다시 시작하는 것 입니다 &
. 또는이를 실행 tar -tfv
하여 new에 대한 제외로 사용할 수 있습니다 tar -cvf
.
tar -cvf
기존 파일을 덮어 씁니다. 당신은 의미 했습니까 tar -rvf
? 또한 아카이브에 작성된 마지막 파일이 불완전했을 수 있습니다.
tar -rvf
?
내가 불완전한 tar
아카이브를 가지고있는 경우에 내가하는 일은 아카이브에 파일 목록을 만듭니다.
tar tf archive.tar | sed -e '/\/$/d' -e x -e '/^$/d' >files-done
이 sed
명령은 슬래시가있는 해당 행을 모두 삭제합니다.이 파일은 파일이 아닌 디렉토리이며, 디렉토리를 다시 덤프하고 해당 디렉토리에서 해당 파일을 건너 뛰고 싶습니다 (첫 번째 tar 아카이브에 이미 있음). 또한 sed
마지막 파일 이름은 부분적으로 만 덤프되었을 가능성이 있으므로 마지막 파일 이름을 삭제하면 다시 아카이브됩니다.
그런 다음 files-done
-X 옵션을 통해 새 tar
명령으로 목록을 전달하십시오 .
tar cfvX archive2.tar files-done SOURCEDIR
새 tar 명령에서 다른 출력 파일 이름을 사용하지 않으면 부분 아카이브를 덮어 씁니다. 손상된 tar 아카이브에 직접 추가하지 마십시오.