상위 디렉터리가 없는 디렉터리의 모든 파일과 하위 폴더를 압축합니다.

상위 디렉터리가 없는 디렉터리의 모든 파일과 하위 폴더를 압축합니다.

다음과 같은 폴더 구조가 있습니다

folder
|
|--foo.txt
|
|--sub_folder
   |
   |--bar.txt

zip 아카이브에 루트 폴더를 포함하지 않고 폴더(파일 및 하위 폴더)의 내용을 압축하고 싶습니다.

나는 명령을 시도했다

zip -r package.zip folder

그러나 여기에는 루트 폴더가 포함됩니다. 또한 다음 형식을 시도했습니다.

zip -j -r package.zip folder

그러나 이렇게 하면 모든 디렉터리 구조가 평면화되고 파일만 포함됩니다. 내부 디렉토리 구조를 유지하지만 상위 폴더를 무시하는 방법은 무엇입니까?

답변1

zip경로는 현재 디렉터리(호출 시)를 기준으로 저장되므로 변경해야 합니다.

(cd folder && zip -r "$OLDPWD/package.zip" .)

&&디렉터리가 올바르게 변경된 경우에만 실행 zip하고 대괄호는 하위 쉘의 모든 항목을 실행하므로 현재 디렉터리가 마지막에 복원됩니다. OLDPWD계산을 피하는 상대 경로를 사용하십시오 package.zip.

답변2

zip -r package.zip folder/*

위 명령은 folder디렉터리 아래의 모든 파일과 하위 폴더를 압축합니다(폴더의 상위 디렉터리는 무시됩니다).

답변3

다른 답변에 추가하려면 스크립트에 사용할 수 있습니다

pushd folder; zip -r ../package.zip .; popd

pushd디렉토리 변경은 와 유사 cd하지만 이전 디렉토리가 기억되고 popd마지막으로 기억된 디렉토리가 복원됩니다.

; cd ..이 경우 대괄호를 제거하고(새 쉘 생성) Stephen이 제안한 대로 명령 끝에 추가하는 것과 같습니다 .

참고: 이것을 주석으로 추가하고 싶지만 평판이 충분하지 않기 때문에 추가할 수 없습니다.

답변4

상위 디렉터리를 피하고 파일만 압축하려면 명령에 -j또는 를 사용해야 합니다.--junk-pathsZip 명령 참조

-j
--junk-paths

디렉터리 이름은 저장되지 않고 저장된 파일의 이름만 저장됩니다(경로 무시). 기본적으로 zip전체 경로(현재 디렉터리 기준)가 저장됩니다.

참고 답변

관련 정보