zip 파일 생성 및 디렉토리 구조 무시


218

이 명령을 사용하여 zip 파일을 만들어야합니다.

zip /dir/to/file/newZip /data/to/zip/data.txt

이것은 작동하지만 생성 된 zip 파일은 원시 파일과 디렉토리를 모방 한 디렉토리 구조를 만듭니다. 내가 필요로하지 않는 추가 폴더가 많이 있습니다.

맨 페이지 나 Google 헌트를 한 눈에 볼 수있는 답변을 찾지 못했습니다.



2
나는이 질문이 다른 스택 교환을 모두 포괄한다고 생각했지만 수퍼 유저의 게시물은 실제로이 것보다 오래되었습니다. 알려 주시면 도와 드리겠습니다. 구글이 여전히 많은 트래픽을 유도하기 때문에 이것은 매우 인기있는 대답이어야합니다. : D
Jake

답변:


353

사용할 수 있습니다 -j.

-j
--junk-paths
          Store just the name of a saved file (junk the path), and do  not
          store  directory names. By default, zip will store the full path
          (relative to the current directory).

19
경우 -j(함께 사용하여 디렉토리 작업을하지 않습니다 -r) 체크 아웃 이 답변
czerasz

) 기본적으로 PUSHD의 popd의 콤보이며, 언젠가는 그냥 일 ... @czerasz 링크를 선호하지 않습니다
TecHunter

36

옵션 -j과 함께 사용 하면 작동하지 않습니다 -r.
따라서 이에 대한 해결 방법은 다음과 같습니다.

cd path/to/parent/dir/;
zip -r complete/path/to/name.zip ./* ;
cd -;

또는 인라인 버전

cd path/to/parent/dir/ && zip -r complete/path/to/name.zip ./* && cd -

화면에 출력을 표시 /dev/null하지 않으려면 출력을 지시 할 수 cd -있습니다


실제로 다음을 수행 할 수 있습니다.cd path/to/parent/dir/ && zip -r ../../../../name.zip ./* && cd -
eddyP23

@ eddyP23 어떤 차이가 있습니까? 오히려 그것은 당신이 아니오를 추가하게 할 것입니다. 경로의 각 디렉토리에 대해 parentDir (..)
Vikas Tawniya

결과는 같습니다. 동의합니다. 그러나 다양한 환경에서 실행되는 자동화 된 스크립트에서는 일반적으로 전역 경로가 무엇인지 전혀 모르기 때문에 전역 경로를 사용하지 않습니다. 그러나 cd path/to/parent/dir/이중 점 ../수를 쉽게 계산할 수 있습니다.
eddyP23

@ eddyP23은 의미가 있습니다
Vikas Tawniya 's

33

-j옵션을 사용하십시오 :

   -j     Store  just the name of a saved file (junk the path), and do not
          store directory names. By default, zip will store the full  path
          (relative to the current path).

18

다소 관련이 있습니다-디렉토리에 대해 동일한 작업을 수행하는 솔루션을 찾고있었습니다. 불행히도이 -j옵션은 작동하지 않습니다 :(

이를 수행하는 방법에 대한 좋은 해결책은 다음과 같습니다. /superuser/119649/avoid-unwanted-path-in-zip-file


3

또는 파일에 대한 임시 심볼릭 링크를 만들 수 있습니다.

ln -s /data/to/zip/data.txt data.txt
zip /dir/to/file/newZip !$
rm !$

이것은 디렉토리에서도 작동합니다.


1

부모 디렉토리를 유지하므로 unzip파일을 어디에서나 흘리지 않습니다.

디렉토리를 압축 할 때 상위 디렉토리를 아카이브에 유지하면 나중에 아카이브 파일의 압축을 풀 때 현재 디렉토리가 흩어지지 않습니다.

따라서 모든 경로를 유지하지 않으려면 -j와 -r을 함께 사용할 수 없으므로 (오류가 발생합니다) 대신 다음을 수행 할 수 있습니다.

cd path/to/parent/dir/;
zip -r ../my.zip ../$(basename $PWD)
cd -;

../$(basename $PWD)상위 디렉토리를 유지 마법이다.

이제 unzip my.zip모든 파일을 포함하는 폴더를 제공합니다.

parent-directory
├── file1
├── file2
├── dir1
│   ├── file3
│   ├── file4

압축이 풀린 파일로 현재 디렉토리를 비우는 대신 :

file1
file2
dir1
├── file3
├── file4

0

-jrm옵션을 사용하여 파일 및 디렉토리 구조를 제거하십시오.

zip -jrm /path/to/file.zip /path/to/file

주의하십시오, -m --move 지정된 파일을 zip 아카이브로 이동하십시오. 실제로, 지정된 zip 아카이브를 만든 후 대상 디렉토리 / 파일을 삭제합니다. 파일을 제거한 후 디렉토리가 비어 있으면 디렉토리도 제거됩니다. zip이 오류없이 아카이브를 만들 때까지 삭제가 수행되지 않습니다. 디스크 공간을 절약하는 데 유용하지만 잠재적으로 위험하므로 모든 입력 파일을 제거하기 전에 -T와 함께 사용하여 아카이브를 테스트하는 것이 좋습니다.
catalint
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.