일부 하위 폴더의 내용을 압축하고 다른 폴더는 압축하지 않음

일부 하위 폴더의 내용을 압축하고 다른 폴더는 압축하지 않음

unix zip 명령을 사용하여 디렉토리를 압축하고 싶습니다. 디렉토리가 다음과 같이 구성되어 있다고 가정합니다.

dir1/
dir1/dir2/
dir1/dir2/file1
dir1/dir2/file2
dir1/dir3
dir1/dir3/file1
dir1/file1
dir1/file2

포함 dir1하도록 압축하고 싶지만 포함하지 않습니다. 간단히 말해서, 그 아래의 모든 파일과 모든 파일을 압축하고 싶지만 어떤 파일도 압축하고 싶지 않습니다.dir1.zipdir1.zipdir1/file1, dir1/file2, dir1/dir2/file1, dir1/dir2/file2, dir3/dir1/dir3/file1dir1dir2dir3

이렇게 하면 그 안의 모든 파일과 하위 폴더가 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바라보다이 답변여러 디렉터리를 정리하는 방법을 알아보세요.

관련 정보