file.txt
에 파일을 추가하고 싶다고 가정해 보겠습니다 . foo.zip
이렇게 할 수 있습니다 .zip -u foo.zip file.txt
foo.zip/very/many/paths/
그러나 zip 파일 내부에 (zip 파일 기준) 경로가 있는 폴더가 이미 있습니다 .
file.txt
zip 파일 내의 위치가 가 되도록 zip 파일에 어떻게 추가합니까 foo.zip/very/many/paths/file.txt
?
필요한 디렉터리 구조를 먼저 만들 수도 있는데 더 쉬운 방법은 없을까요?
나는 보통 이렇게 합니다:
$ls 파일.txt foo.zip $ mkdir 매우 $ mkdir 매우/많이 $ mkdir 매우/다/경로 $ cp file.txt 매우/다수/경로 $ zip -u foo.zip 매우/다/경로/file.txt $ rm -rf 매우
답변1
Python의 zipfile 라이브러리를 사용하시나요?
~/wrk/tmp$ ls test.zip
ls: cannot access test.zip: No such file or directory
좋아요 이제 "test.zip"이 없습니다...
~/wrk/tmp$ python -c 'import zipfile,sys ; zipfile.ZipFile(sys.argv[1],"a").write(sys.a
rgv[2],sys.argv[3])' test.zip /etc/motd text/motd
존재하지 않는 zip 파일에 "/etc/motd"를 "text/motd"로 추가해 보겠습니다...
~/wrk/tmp$ ls -l test.zip
-rw-r--r-- 1 yeti yeti 473 Mar 23 09:51 test.zip
zipfile 라이브러리는 "test.zip"을 생성하기에 충분합니다.
~/wrk/tmp$ unzip -lv test.zip
Archive: test.zip
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
357 Stored 357 0% 2014-03-20 15:47 ff1b8b7f text/motd
-------- ------- --- -------
357 357 0% 1 file
..내가 원하는 내용이 담겨있는 것 같은데..
표준출력으로 압축을 풀어서 확인해 보겠습니다...
~/wrk/tmp$ unzip -p test.zip text/motd
Linux aurora 3.2.0-0.bpo.4-amd64 #1 SMP Debian 3.2.54-2~bpo60+1 x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
아름다운!
이제 두 번째 파일을 추가합니다.
~/wrk/tmp$ python -c 'import zipfile,sys ; zipfile.ZipFile(sys.argv[1],"a").write(sys.argv[2],sys.argv[3])' test.zip /etc/issue otherdir/issue
~/wrk/tmp$ ls -l test.zip
-rw-r--r-- 1 yeti yeti 605 Mar 23 09:52 test.zip
(yeti@aurora:1)~/wrk/tmp$ unzip -lv test.zip
Archive: test.zip
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
357 Stored 357 0% 2014-03-20 15:47 ff1b8b7f text/motd
28 Stored 28 0% 2012-09-21 22:52 f9c3990c otherdir/issue
-------- ------- --- -------
385 385 0% 2 files
~/wrk/tmp$ unzip -p test.zip otherdir/issue Debian GNU/Linux 6.0 \n \l
~/wrk/tmp$ _
답변2
제가 추천하는 한 가지 방법은 압축을 풀고 파일을 이동한 다음 다시 압축하는 것입니다.
예를 들어 다음 zip 파일이 있다고 가정해 보겠습니다.
Archive: foo.zip
Length Date Time Name
--------- ---------- ----- ----
0 2013-01-30 14:38 very/
0 2013-01-30 14:38 very/many/
0 2013-01-30 14:38 very/many/paths/
0 2013-01-30 14:38 very/many/paths/foo.txt
0 2013-01-30 14:38 file.txt
--------- -------
0 5 files
파일의 압축을 풀려면 /tmp
먼저 디렉터리를 만듭니다. 그런 다음 다음을 수행합니다.
foo.zip
임시 디렉토리에 추출d=$(mktemp -t -d foo.zip.XXXXXX) && unzip -d $d foo.zip
- 파일을 새 경로로 이동합니다( temp dir 기준
$d
).mv ${d}/file.txt ${d}/very/many/paths/
- 서브셸에서:
cd
임시 디렉터리로 이동하여 모든 것을 새 zip 파일로 다시 압축합니다.( cd $d && zip -r foo.zip ./* )
- 임시 디렉터리에서 새 zip 파일을 이동하여 이전 파일을 교체하세요.
mv ${d}/foo.zip ./
- 청소하세요 :-)
rm -rf ${d}
답변3
당신은 그것을 사용할 수 있습니다개미그런 이유로.
다음이라는 파일을 만듭니다 build.xml
.
<project name="zip-utils">
<target name="add-file-to-zip">
<fail message="Property 'zip' must be set" unless="zip" />
<fail message="Property 'file' must be set" unless="file" />
<fail message="Property 'path' must be set" unless="path" />
<available file="${zip}" property="zip.exists" />
<fail message="Zip file missing: ${zip}" unless="zip.exists" />
<available file="${file}" property="file.exists" />
<fail message="File missing: ${file}" unless="file.exists" />
<dirname property="file.dir" file="${file}"/>
<basename property="file.filename" file="${file}"/>
<zip destfile="${zip}" update="true">
<zipfileset fullpath="${path}" dir="${file.dir}" includes="${file.filename}"/>
</zip>
</target>
</project>
그런 다음 동일한 디렉터리에서 build.xml
다음을 사용하여 실행할 수 있습니다.
ant add-file-to-zip -Dzip=foo.zip -Dfile=file.txt -Dpath=/very/many/paths/file.txt