Zip 파일에서 원하지 않는 경로를 피하십시오


49

일부 파일을 패키징하기 위해 쉘 스크립트를 만들고 있습니다. 다음과 같은 디렉토리를 압축하고 있습니다.

zip -r /Users/me/development/something/out.zip /Users/me/development/something/folder/

문제는 결과 out.zip 아카이브에 전체 파일 경로가 있다는 것입니다. 즉, 압축을 풀면 전체 "/ Users / me / development / anotherthing /"경로가됩니다. 디렉토리를 아카이브에 넣을 때 이러한 깊은 경로를 피할 수 있습니까?

대상 디렉토리 내부에서 zip을 실행하면이 문제가 없습니다.

zip -r out.zip ./folder/

이 경우 모든 쓰레기를 얻지는 못합니다. 그러나 해당 스크립트는 어디에서나 호출됩니다.

FWIW, Mac OS X 10.6에서 bash를 사용하고 있습니다.

답변:


85

스크립트를 사용해야 cd하거나 pushdpopd아카이브의 루트가 될 디렉토리로 이동하기 전에 발행 zip명령을 사용합니다. 이 작업을 수행하는 방법은 스크립트가 압축 할 항목을 알고있는 방법에 따라 다릅니다. 그러나 / Users / me / development / something / folder 가 내부 경로 ./folder로 압축되도록 하려면 다음을 수행해야합니다.

pushd /Users/me/development/something
zip -r /path/to/out.zip ./folder/
popd

원하는 상대 경로가 포함 된 out.zip 이 생성됩니다 .

스크립팅에 도움이 필요하면 스크립트를 보여 주어야합니다.


8
문제 없어요. : 내가 명령 줄에서 한 - 라이너에 예를 들어, 모든 시간을, 이렇게 $ pushd /some/path ; do-something ; popd도 서브 쉘로 ... 나 :$ ( cd /some/path ; do-something )
돌팔이 의사 키호테

1
@ ~ quack : 주석에서 서브 쉘 기술의 경우 +1.
Jonathan Leffler

1
실패 대신 (오타 또는 다른 문제) 다른 명령이 실행되지 않도록 &&대신 대신 사용 ;하는 것이 좋습니다 cd.(cd /some/path && do-something)
Chris Johnsen

3
zip 파일의 절대 경로를 지정하지 않고이 작업을 수행 할 수있는 방법이 없습니까?
orange80

2
왜 경로로 게임을하고 있습니까? 왜 사용하지 zip -j않습니까?
jww

5

문제는 결과 out.zip 아카이브에 전체 파일 경로가 있다는 것입니다.
...
디렉토리를 아카이브에 넣을 때 이러한 깊은 경로를 피할 수 있습니까?

예. -j옵션을로 사용하십시오 zip. -j"정크 경로"입니다. zip매뉴얼 페이지에 따르면 :

저장된 파일의 이름 만 저장하고 (경로를 정크) 디렉토리 이름은 저장하지 마십시오. 기본적으로 zip은 전체 디렉토리를 저장합니다 (현재 디렉토리에 상대적).

사용 -j은 다음 명령을 의미합니다.

zip -j myarchive.zip file1.txt dir1/file2.txt dir2/dir3/file3.txt ../file4.txt

다음과 같은 아카이브를 만듭니다.

myarchive.zip
    |
    +-- file1.txt
    +-- file2.txt
    +-- file3.txt
    +-- file4.txt

5
이것은 '폴더'디렉토리의 경로조차도 모든 경로를 손상시키지 않습니까? OP는 명령 줄의 경로 만 제거하고 싶다고 생각합니다.
피터 자릭

1
이것은이 질문에 대한 답이 아닐 수도 있지만 내가 필요한 것입니다.
Aaron McMillin

1
이 답변은 사용자가 평평한 지퍼를 원한다고 잘못 가정합니다. 이는 잘못된 가정이며 다른 하위 폴더에있는 두 파일의 이름이 같은 경우 스크립트가 실패 할 수 있습니다.
앤드류 슈워츠

1

pushdpopd하고 $OLDPWD. 은 가정 $PWD입니다 /Users/me/development수행

pushd something/folder
zip -r $OLDPWD/something/out.zip *
popd

지금은 $PWD다시입니다/Users/me/development

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