unix zip 명령을 사용하여 디렉토리를 압축하고 싶습니다. 디렉토리가 다음과 같이 구성되어 있다고 가정합니다.
dir1/
dir1/dir2/
dir1/dir2/file1
dir1/dir2/file2
dir1/dir3
dir1/dir3/file1
dir1/file1
dir1/file2
포함 dir1
하도록 압축하고 싶지만 포함하지 않습니다. 간단히 말해서, 그 아래의 모든 파일과 모든 파일을 압축하고 싶지만 어떤 파일도 압축하고 싶지 않습니다.dir1.zip
dir1.zip
dir1/file1, dir1/file2, dir1/dir2/file1, dir1/dir2/file2, dir3/
dir1/dir3/file1
dir1
dir2
dir3
이렇게 하면 그 안의 모든 파일과 하위 폴더가 zip dir1 dir1/
압축되지만 dir1
하위 폴더의 내용은 압축되지 않습니다. 이렇게 하면 모든 파일과 모든 하위 폴더를 포함하여 zip -r dir1 dir1/
그 안에 있는 모든 내용이 압축됩니다 . dir1
어떤 하위 폴더를 재귀적으로 압축해야 하는지, 어떤 하위 폴더를 압축하지 말아야 하는지 제어할 수 있기를 원합니다.
감사해요.
답변1
$ zip -r dir1 dir1 -x dir1/dir3/*
나를 위해 작동합니다. -x
제외 옵션입니다 . 포함 옵션을 사용할 수도 있지만 이 경우 제외 옵션에는 입력이 덜 필요합니다.
사실 이 문제는 완전히 명확하지 않습니다. 아래의 모든 디렉터리와 파일을 제외하시겠습니까 dir3
, 아니면 아래의 파일만 제외 하시겠습니까 dir3
? 위의 명령은 후자에서만 작동합니다.
답변2
아카이브 파일을 사용하는 한 가지 방법은 해당 파일을 마운트한 다음 일반 디렉터리처럼 액세스하는 것입니다.퓨즈다음과 같이 사용할 수 있습니다.대부분의 유니스그리고 여러 가지를 지원합니다압축 파일에 대한 파일 시스템의 투명한 액세스. zip 파일의 경우 가능성은 다음과 같습니다.퓨즈 지퍼(AVFS또한 편리하지만 읽기 전용입니다.
예를 들어 fusion-zip을 사용하여 아카이브를 마운트하고 여기에 파일을 복사하는 방법은 다음과 같습니다.
mkdir tmp
fuse-zip /path/to/zip tmp
rsync -av --exclude='/dir1/dir3/*' dir1 tmp/
fusermount -u tmp; rmdir tmp
답변3
dir1의 상위 디렉터리에서 다음 명령을 시도해 보세요.
tar --exclude=dir3/* -cf - dir1/ | zip dir1.zip -
dir1.zip의 압축을 풀려면 다음 명령을 사용하십시오.
unzip -p dir1.zip | tar xf -
답변4
신뢰할 수 있는 유일한 방법은 zip
아카이브할 파일 목록을 전달하는 것입니다. 예를 들면 다음과 같습니다.
find dir1 \! \( -path dir1/dir3 -prune \) | sort | zip dir1.zip -@
이렇게 하면 아카이브에 제외된 디렉터리나 해당 하위 디렉터리가 포함되지 않습니다. 에 대한 인수는 해당 디렉토리의 출력과 정확히 일치해야 합니다 -path
. find
바라보다이 답변여러 디렉터리를 정리하는 방법을 알아보세요.