기존 tar.gz 아카이브에 파일을 추가 / 업데이트 하시겠습니까?


73

tar.gz 아카이브에 파일을 추가 / 업데이트하는 방법이 있습니까? 기본적으로 파일이 포함 된 아카이브가 있으며 /data/data/com.myapp.backup/./files/settings.txt해당 파일을 아카이브에서 가져오고 (이미 완료) 편집이 완료되면 다시 아카이브로 푸시하고 싶습니다. 어떻게하면됩니까? .경로 때문에 문제가 있습니까?


2
+1. 이렇게하면 OS X에서 작업하기가 쉬워집니다. 현재 모든 숨겨진 파일의 디렉토리를 수동으로 정리 한 다음 디렉토리 .DS_Store를 다시 압축해야합니다.

답변:


15

tar 파일 형식은 몇 개의 헤더와 함께 연결된 일련의 파일입니다. 그것을 찢고 내용물을 넣은 다음 다시 정리하는 것은 그리 복잡한 일이 아닙니다. 즉, Jander는 tar as a program이 어떻게 유틸리티 기능을 가지고 있지 않고 압축과 관련하여 추가 합병증이 있는지를 설명했습니다.

그러나 작업을위한 도구가 있습니다! 압축 된 tar 아카이브의 루프백 마운트를 폴더에 수행 한 다음 파일 시스템을 변경할 수있는 시스템이 두 개 이상 있습니다. 완료되면 폴더를 마운트 해제하면 압축 된 아카이브를 롤링 할 수 있습니다.

첫 번째 옵션은 FUSEarchivemount 프로젝트입니다 . 여기 에 튜토리얼이 있습니다. 시스템에 이미 FUSE가있을 수 있으며 배포가 없으면 배포에 대한 옵션이 있어야합니다.

다른 옵션은 tarfs 입니다. 사용하는 것이 더 간단 하지만 bzip2 아카이브를 손상시키는 데 문제가 있다고 들었습니다.


1
우분투와 데비안에 패키지 된 AVFS를 사용 합니다. archivemount 및 tarfs가 AVFS와 비교되는 방식을 알고 있습니까?
Gilles 2016 년

솔직히 아니, 난 당신이 대안을 언급 한 지금 AVFS를보고 궁금하지만. archivemount와 tarfs를 모두 사용했지만 프로젝트가 해제 된 지 오래되어 현재 상태를 알 수 없습니다. 구현이 완벽하게 작동하더라도 아이디어가 개념적으로 잘못되었다는 것을 그 경험에서 결정했습니다.
Caleb

archivemount 작동 방식을 살펴 보았습니다. 기존 .tar.gz 파일은 수정하지 않지만 마운트를 해제하면 원본 이름이 바뀌고 대신 새 tar 파일이 만들어집니다. 좋은 사용자 경험을 찾고 있다면 훌륭하지만 효율성 때문에 전체 아카이브를 다시 작성하지 않으려는 경우 도움이되지 않습니다.
Jander

@Jander 그것은 지적하기위한 것입니다. 그래도 모든 압축 아카이브 마운트 옵션에 적용됩니다. 문제는 파일의 개별 부분이 압축되지 않고 전체 파일 내부 헤더와 모두 압축되며 다른 것을 추출하기 위해 gzip을 전체 데이터 세트 에서 실행해야한다는 것 입니다. 압축을 풀고 전체 데이터 파일을 다시 쓰지 않고 중간에 무언가를 주입하는 방법은 없습니다. 따라서 개념 적으로 잘못된 해결책에 대한 나의 이전 의견 . 아카이브는 아카이브입니다.
Caleb

43

아카이브에서 파일을 가져 오려면을 사용할 수 있습니다 tar xzf archive.tar.gz my/path/to/file.txt. 파일 경로의 디렉토리도 작성됩니다. tar t(예 :)를 사용 tar tzf archive.tar.gz하여 아카이브의 파일을 나열하십시오.

tar파일의 "in-place"업데이트를 지원하지 않습니다. 그러나 파일이 이미 아카이브에있는 파일과 동일한 경로를 가지고 있더라도 파일을 아카이브 끝에 추가 할 수 있습니다. 이 경우 파일의 두 사본이 모두 아카이브에 있으며 나중에 추가 된 파일이 이전 파일을 대체합니다. 이를 위해 사용할 명령은 tar r(또는 tar u아카이브보다 최신 파일 만 추가하는 것) 사용하는 명령입니다. .경로는 문제가되지 않습니다.

그러나 압축 된 아카이브에는 추가 할 수 없습니다. 따라서 다음을 수행해야합니다.

gunzip archive.tar.gz
tar rf archive.tar data/data/com.myapp.backup/./files/settings.txt
gzip archive.tar

전체 아카이브를 두 번 이상 다시 쓰는 것을 의미하기 때문에 아마도 듣고 싶지 않을 것입니다. 매우 큰 아카이브가 아닌 경우 전체 내용을 푼 다음 편집 한 후 다시 타르 팅하는 것이 좋습니다. 또는 압축되지 않은 아카이브를 사용할 수 있습니다.


이 답변은 표준 tar프로그램 을 다루는 한 정확 합니다. 파일 형식의 Tar은 실제로 매우 액세스 가능합니다. 내용을 직접 업데이트하는 스크립트를 쉽게 작성할 수 있지만 이미이를 수행하는 다른 도구가 있습니다.
Caleb

23
당신은 또한 이것을 유닉스 방식으로 할 수 있습니다 :gzip -dc archive.tar.gz | tar -r data/data/com.myapp.backup/./files/settings.txt | gzip >archive_new.tar.gz
Simon Richter

2
IIRC는 단순히 두 개의 gzip 파일을 연결할 수 있습니다. 결과는 압축되지 않은 파일이 모두 포함 된 더 큰 gzip 파일입니다.
FUZxxl

파일 압축이 풀리면 --update 플래그를 사용할 수 없습니까?
pietro

gzip 연결을 언급하는 @FUZxxl +1
Johan Boulé

9

Tar은 원래 테이프 용으로 사용되었으므로 "바꾸기"파일은 실제로 설계에 포함되지 않습니다. 그러나 --delete를 사용하여 원래 tar에서 파일을 삭제 한 다음 -u를 사용하여 tar를 업데이트하고 파일을 다시 추가 할 수 있습니다. tar는 아카이브를 내부적으로 재구성해야하므로 약간 시간이 걸릴 수 있습니다.


StackExchange에 오신 것을 환영합니다! 귀하의 답변에는 다른 답변 에서 이미 작성된 제안 만 포함되어 있습니다 . 중복을 피하기 위해 답변하기 전에 질문에 대한 다른 답변을 읽으십시오.
JigglyNaga

1
내 답변을 약간 편집했습니다. 나는 다른 대답이 언급하지 않는다고 생각한다 --delete
rleibman

-5

Linux x86_64 GNU / Linux에서 해당 작업을 수행하려면 다음 명령을 사용하십시오.

tar cvfpz /path/archive.tar -T list.txt

이 명령 /path은 파일에 포함 된 list.txt파일 목록을 사용하여 압축 된 아카이브를 작성 합니다.


6
해당 파일 /path/archive.tar을 추가 / 업데이트하는 대신 기존 파일을 덮어 씁니다 .
Anthon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.