zip 아카이브에서 하나의 파일을 업데이트하는 방법


88

새 파일을 추가하고 다시 압축하여 이전 파일을 삭제하고 압축을 풀지 않고 zip 파일의 파일을 바꿀 수 있습니까?

이유는 내가 가끔 업데이트해야하는 zip 파일 안에 하나의 xml이있는 정말 큰 zip 파일이 있다는 것입니다. zip 압축을 풀고 다시 압축하는 데 시간이 오래 걸립니다. 그래서 스크립트를 통해 zip 내의 하나의 xml을 바꿀 수 있기를 원합니다. 나는 이미 가지고있는 xml에 대한 업데이트를 확인했습니다.

그래서 압축을 풀고 다시 압축하지 않고 하나의 xml 만 바꿀 수 있습니까?

죄송합니다. zip 명령을 사용하여 그런 일을 할 수 있지만 문제는 스크립트가 실제로 안드로이드 폰용이며 zip은 사용할 수있는 명령이 아니라는 점입니다. 내가 할 수 있다면 zip을 확실히 사용했을 것이지만 droid에 대해서만 압축을 풀고 busybox에 tar가 있지만 tar가 필요한 작업을 수행하지 않습니다.


3
질문 제목을 좀 더 의미있는 것으로 바꿀 수 있습니까?
tokland

7
또한 질문은 한두 문장 일 수 있습니다. 그 중 약 80 %가 엉망입니다.
Dennis Williamson

답변:


63

에서 지퍼 (1) :

기존 zip 아카이브의 이름이 주어지면 zip은 zip 아카이브에서 동일한 이름의 항목을 대체하거나 새 이름에 대한 항목을 추가합니다.

따라서 zip지정한 .zip 파일 이름이 기존 아카이브가되는 것을 제외하고는 해당 파일 하나만 포함하는 새 .zip 파일을 만들 때 일반적으로 사용하는 명령을 사용하십시오 .


5
누군가 예를 들어 주시겠습니까? zip 명령의 도움을 이해하지 못합니다.
Gustave 2015

12
zip -r myfolder.zip myfolder업데이트하려면 myfolder를 사용하여 압축했다고 가정 해 보겠습니다 myfolder/otherfolder/myfile.txt. 파일을 편집하고 실행합니다.zip -r myfolder.zip myfolder/otherfolder/myfile.txt
eakkas

1
대체 할 파일의 이름이나 구조가 변경 될 파일과 동일하지 않은 경우 어떻게해야합니까?
Fractaliste

2
@Fractaliste 이름과 구조를 동일하게 만들어야합니다;)
Hack5

75

Linux zip파일은 zip에서 단일 파일을 바꾸는 데 번거 롭다 는 것을 알았습니다 . jarJava Development Kit 의 유틸리티가 더 쉬울 수 있습니다. WEB/web.xmlJAR 파일 (단지 zip 파일)에서 업데이트하는 일반적인 작업을 고려하십시오 .

jar -uf path/to/myapp.jar -C path/to/dir WEB-INF/web.xml

여기에 path/to/dir디렉토리가 포함 된 WEB-INF디렉토리 의 경로가 있습니다 (이 차례로 포함됨 web.xml).


WEB-INF해당 파일이 있는 디렉터 를 만드는 대신 파일 만 복사해야하는 경우
도움의 손길

또한 제 경우에는 오래된 "jar"유틸리티가 트릭을 수행했습니다! 감사!
bitfox

52

다음을 시도하십시오.

zip [zipfile] [file to update] 

예 :

$ zip test.zip test/test.txt
updating: test/test.txt (stored 0%)

2
이것은 예제 덕분에 이해하기 가장 쉬운 것입니다. 감사합니다!
vatsug

2
zip 내부의 파일을 업데이트하려는 경우 updating:대신 표시되어야한다는 점을 고려하십시오 adding:. 그렇지 않으면 파일을 대체하지 않고 zip에 추가합니다.
Edenshaw

당신 말이 맞아요. 감사합니다!
WizardsOfWor

13

나는 이것이 오래된 질문이라는 것을 알고 있지만 똑같이하고 싶었습니다. zip 아카이브의 파일을 업데이트합니다. 그리고 위의 답변 중 어느 것도 나를 정말로 도왔습니다.

여기 내가 한 일이 있습니다. 임시 디렉토리를 생성했습니다 abc. 복사 file.zipabc해당 디렉토리에 파일을 추출 하였다. 편집하고 싶은 파일을 편집했습니다. 그런 다음에있는 동안 abc다음 명령을 실행했습니다.

user@host ~/temp/abc $ zip -u file.zip
updating: content/js/ (stored 0%)
updating: content/js/moduleConfig.js (deflated 69%)

-u 스위치는 변경된 / 새 파일을 찾고 zip 아카이브에 추가합니다.


12

업데이트 플래그를 사용하십시오. -u

예:

zip -ur existing.zip myFolder

이 명령은 압축 myFolder하여 existing.zip.


고급 사용법 :

업데이트 플래그는 실제로 들어오는 파일을 기존 파일과 비교하고 새 파일을 추가하거나 기존 파일을 업데이트합니다.

따라서 zip 파일 내에서 특정 하위 디렉토리를 추가 / 업데이트하려면 원하는대로 소스를 업데이트 한 다음 -u플래그로 전체 소스를 다시 압축하면 됩니다. 변경된 파일 만 압축됩니다.

소스 파일에 액세스 할 수없는 경우 zip 파일의 압축을 풀고 원하는 파일을 업데이트 한 다음 -u플래그를 사용하여 다시 압축 할 수 있습니다 . 다시 말하지만, 변경된 파일 만 압축됩니다.

예:

원본 소스 구조


ParentDir
├── file1.txt
├── file2.txt
├── ChildDir
│   ├── file3.txt
│   ├── Logs
│   │   ├── logs1.txt
│   │   ├── logs2.txt
│   │   ├── logs3.txt

업데이트 된 소스 구조


ParentDir
├── file1.txt
├── file2.txt
├── ChildDir
│   ├── file3.txt
│   ├── Logs
│   │   ├── logs1.txt
│   │   ├── logs2.txt
│   │   ├── logs3.txt 
│   │   ├── logs4.txt <-- NEW FILE 

용법

$ zip -ur existing.zip ParentDir 
> updating: ParentDir/ChildDir/Logs (stored 0%)
>   adding: ParentDir/ChildDir/Logs/logs4.txt (stored 96%)


1

zip 파일을 새로 고치는 -f 옵션도 있습니다. zip이 생성 된 이후 업데이트 된 모든 파일을 업데이트하는 데 사용할 수 있습니다 (zip 파일 내의 트리 구조 내 동일한 위치에 있다고 가정).

파일 이름이 /myfiles/myzip.zip이면해야 할 일은

zip -f /myfiles/myzip.zip

0

ZIP 아카이브 구조의 측면에서-zip 파일을 다시 압축하지 않고 업데이트 할 수 있습니다. 교체해야하는 파일 이전의 모든 파일을 건너 뛰고 업데이트 된 파일을 넣은 다음 나머지 파일을 넣으면됩니다. 마지막으로 업데이트 된 중앙 디렉토리 구조를 배치해야합니다. 그러나 대부분의 일반적인 도구를 사용하면 이것을 만들 수 있을지 의심됩니다.


0

7zip (7za)는 파일 / 디렉토리를 멋지게 추가 / 업데이트하는 데 사용할 수 있습니다.

예 :MANIFEST.MF JAR 파일 의 파일 대체 (파일 날짜에 관계없이) . /source/META-INF디렉토리는 포함 MANIFEST.MF당신이에 넣어 원하는 파일 jar(zip 파일)

7za a /tmp/file.jar /source/META-INF/

업데이트 만 (소스가 오래된 경우 대상을 대체하지 않음)

7za u /tmp/file.jar /source/META-INF/

-2

네 가능합니다.

Linux 기반 시스템에서는 zip을 설치하기 만하면 명령 줄에서 호출 할 수 있습니다. 맨 페이지를보십시오 : http://linux.die.net/man/1/zip

그러나 내 개인적인 경험상 가능하고 압축이 그다지 중요하지 않은 경우 일반 tar 파일과 tar에서 더 잘 작동합니다.

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