zip 파일을 결합 / 병합하는 방법은 무엇입니까?


21

지난 몇 달 동안 매주 간격으로 zip 파일로 여러 데이터 폴더를 복사했습니다. 이제 기존 zip 파일의 내용 대부분이 동일한 데이터 파일의 다른 버전이기 때문에 zip 파일을 하나의 zip 파일로 결합하고 싶습니다.

따라서 파일이 기존 zip 파일 중 둘 이상에 나타나는 경우 최신 버전의 새 zip 파일을 만들고 싶습니다. 물론 파일이 하나의 기존 zip 파일에만 나타나면 최종 zip 파일에도 파일이 필요합니다.

하나의 작업 폴더로 하나씩 압축을 풀고 오래된 zip 파일의 데이터를 최신 zip 파일의 데이터로 덮어 쓴 다음 모든 것을 새로운 zip 파일로 다시 압축하지 않으려 고합니다.

내가 이해하는 것에서 pkzip은 zip 파일 자체를 결합하지만 누구든지 나에게 말할 수있는 신뢰할 수 있고 빠른 무료 방법이 있습니까?


1
승리 zipmerge
코드 블링

답변:


7

당신은 그것을 좋아하지 않을 것입니다 : 모든 것을 올바른 순서로 작업 폴더에 압축 해제 한 다음 결과를 압축하는 것이 가장 효과적인 방법입니다.

그렇지 않으면 많은 CPU 사이클이 낭비됩니다.

  • 결과가 'first.zip'으로 이동한다고 가정
  • '2.zip', '3.zip'등의 모든 파일은 압축을 풀고 'first.zip'에 다시 압축해야합니다.
  • '2.zip'에는 'foobar.txt'파일이 있고 '3.zip'에는 다른 파일 'foobar.txt'가 있습니다. 병합하려는 방식으로 병합하면 'X 번 압축'됩니다
  • .zip의 toc는 파일의 끝에 있습니다. 더 많은 내용을 추가하고 (중간
    에서 파일을 업데이트 하여 .zip의 중간에) 전체 파일을 다시 작성해야합니다.

그래서, 이럴 단지 '를 사용 압축 해제 'wiseley :

% mkdir all
% for x in *.zip ; do unzip -d all -o -u $x ; done
% zip -r all.zip all

압축 해제 순서는 중요합니다 .zip 이름의 패턴을 모르지만 먼저 최신 zip 파일을 추출합니다. unzip의 '-u'옵션은 파일이 최신 인 경우에만 파일을 덮어 쓰거나 그렇지 않은 경우 파일을 만듭니다. 이미 있습니다. 결과적으로 최신 파일 만 압축 해제하고 결과를 한 번만 압축합니다.


이것은 사용자 관점에서 가장 효과적 일 수 있지만 정확하지는 않습니다. zip의 파일 테이블은 실제로 끝이지만 임의의 zip 끝에 파일을 임의로 쓴 다음 새 파일 테이블을 쓸 수 있습니다. 마지막 기록이 항상 이깁니다. 스크립팅 또는 프로그래밍에 익숙하지 않은 사용자는 바이너리 청크를 이동하고 zip 테이블을 업데이트하여 파일을 압축 해제하거나 압축하지 않고도이 전체 프로세스를 수행 할 수 있습니다.
caesay

사실, 모든 zip을 단일 파일 (원하는 순서로)로 연결 한 다음 끝에 최신 버전의 파일 만 포함하도록 새 파일 레코드를 작성할 수 있습니다. 이는 지퍼가 여전히에게 nessesary 경우 복구 할 수있는 파일의 이전 버전에 포함 된 추가 혜택이있다
caesay

" '2.zip', '3.zip'등의 모든 파일을 압축 해제 한 다음 'first.zip'에 다시 압축해야합니다."가 올바르지 않습니다. 이 zipmerge유틸리티는 예를 들어 압축 해제 및 재 압축없이 ZIP 아카이브를 병합합니다.
ZachB

나는 unzipping/를 사용 zipping하지 않았다 uncompress / decompress. 그렇습니다. 분명히 하나의 항목 2.zip(압축 된 얼룩) first.zip을 가져 와서 전송할 수 있으므로 "압축"이 발생하지 않습니다. 그러나 기존 항목을 대체하거나 (기본적으로 전체 파일을 다시 작성해야 함을 의미하는 경우) 2.zipTOC에서 BLOB을 추출하고 TOC의 존재를 조회 first.zip해야하며 마지막에 추가해야합니다. 우편 번호를 추가하십시오. 어떻게 zipmerge다른 방법으로 압축 항목을 병합 할 수 있는지 알 수 없습니다 (압축 제외)
akira

-1이 작업을 수행하는 데 훨씬 더 효율적인 방법이 있기 때문에 "가장 효과적인 방법"에 대한 정당성이 전혀 의미가 없습니다. every file [...] has to be unzipped and then zipped again- 아니, 그게 무슨 없습니다 당신의 솔루션 않습니다. in '2.zip' exists a file 'foobar.txt' and in '3.zip' exists another file 'foobar.txt'. merging it the way you want to merge it leads to 'compress it X times'-아니에요 왜 그런가요? you add more content [...] and the whole file has to be rewritten-아니요, 한 번에 출력을 씁니다. 왜 누군가가 이것을지지 했습니까?
benrg

4

ZIP의 -g 옵션을 사용하면 ZIP 파일을 하나만 추가 할 수 있습니다 (이전 파일을 추출하지 않고). 이렇게하면 상당한 시간이 절약됩니다.

zipmerge도 살펴 보십시오


4
-g기존 zip에 파일을 추가합니다. 병합하지 않습니다. 예 : zip -g result.zip other.zip파일 other.zip을 result.zip에 추가합니다. . --grow 지정된 zip 아카이브를 새 파일로 생성하지 않고 확장 (추가)합니다. 이 작업이 실패하면 zip은 아카이브를 원래 상태로 복원하려고 시도합니다. 복원이 실패하면 아카이브가 손상 될 수 있습니다. 기존 아카이브가 없거나 하나 이상의 아카이브 멤버를 업데이트하거나 삭제해야 할 경우이 옵션은 무시됩니다 .`
akira



1

임시 디렉토리로 추출되는 파일을 스크립트 할 수 있다고 생각했습니다.

이 명령 행에 문제점이 있습니다. 아카이브 압축 풀기를 주문하는 방법을 찾지 못해 오래된 아카이브가 새로운 아카이브를 덮어 쓸 수 있습니다. 이 문제는 명령 줄 스위치가있는 압축 해제기를 사용하면 극복 할 수 있습니다. 나는 주로 그러한 명령 줄 옵션이없는 7-Zip을 사용합니다.

또한이 명령은 동일한 디렉토리에있는 모든 zip 파일에 필요합니다. 모든 지퍼의 이름이 고유 한 경우 문제가되지 않습니다. 즉, 상황에 맞게 명령을 변경할 수 있습니다.

for /f %f in ('dir /b *.zip') do "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoa

다른 압축 해제 프로그램을 사용하도록 이것을 변경하려면 "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoa각 파일에서 실행할 명령으로 바꾸십시오 . %f압축을 풀려는 파일 이름의 자리 표시 자로 사용하십시오 .

무료 또는 기타 세련된 응용 프로그램을 찾으려고했지만 실제로 찾지 못했습니다.

잘하면 이것이 좋은 시작이 될 것이며 WinZip 또는 이와 유사한 것이 덮어 쓰기 문제를 해결할 수 있기를 바랍니다.

행운을 빕니다.


0

내가 정확하게 기억한다면, pkzip 은 명령 행 프로그램이었습니다.

pkzip과 호환된다고 주장하는 ZIP의 명령 행 버전이 여전히 있습니다.

Info-ZIP 라고 하며 OS 용 버전이 있어야합니다.


내가 묻는 기능이 있습니까? 이 기능이 나열된 곳을 찾을 수 없습니다.
CChriss

1
Info-Zip 제품군은 파일 을 PKZip과 호환 가능 하게 만들지 만 프로그램 자체는 다르며 병합 옵션을 포함하지 않는 것 같습니다.
CarlF

죄송합니다. 수년 전에 DOMAIN / OS의 Apollo 워크 스테이션에서 Info-Zip을 컴파일하고 실행할 수있었습니다. DOS / VMS / Unix와 그 밖의 다른 기능들에도 다른 기능을 제공했다고 생각합니다. 나는 그것이 더 발전했을 것이라고 생각합니다.
pavium

0

인터넷에서 winzip 명령 행을 찾으십시오. Winzip에는 설치했을 수있는 모든 Winzip 버전에 맞는 여러 버전의 명령 줄 도구가 있습니다. 명령 행 도구 WZZIP에는 -f "freshen"옵션이 있습니다.이 옵션은 요약 출력 zip 파일의 파일 이름과 일치하는 최신 파일 만 압축합니다.

위와 같이 FOR 문으로 랩핑 된 WZunzip을 사용하여 하나의 파일을 디렉토리에 압축 해제 한 다음 WZzip -f를 사용하여 해당 파일을 출력 합계 zip 파일에 추가하십시오. 그런 다음 FOR 루프는 다음 입력 파일에서 작동하여 하나의 요약 출력 파일로만 출력됩니다. WZzip -f는 입력 데이터가 이미 출력 파일에있는 것보다 최신 인 경우에만 출력 파일에 추가하므로 입력 파일의 순서는 중요하지 않습니다. 출력 파일에 존재하지 않는 모든 파일도 추가됩니다. 그런 다음 결과를 폴더에 압축 해제 한 다음 다시 압축하여 효율적으로 압축 된 결과 파일을 얻을 수 있습니다. 배치 파일 끝에서 FOR 루프 후에 자동으로이를 수행 할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.