디렉토리에 모든 파일을 압축 하시겠습니까?


483

zip명령을 사용하여 주어진 디렉토리의 모든 파일을 압축하는 방법이 있습니까? 을 사용하는 것에 대해 들었지만 *.*확장명이없는 파일에서도 작동하고 싶습니다.


2
원하는 디렉토리에서 한 수준 위로 탐색하고 수행 해 보셨습니까 zip myarch.zip mydir/*?
Joseph R.

13
또는 더 나은zip -r myarch.zip mydir/*
Adam

25
또는 더 나은zip -r myarch.zip mydir
ctrl-alt-delor

*.*점이있는 파일을 의미합니다. cp / m 및 dos에서 모든 파일에 점이 생겼으므로 입력 할 수 없었습니다 ( *). 따라서 사람들은 *.*모든 파일 로 보았습니다 . 결국 Microsoft는 점이 0 개 이상일 수있는 긴 파일 이름을 추가했습니다. 창에 점이있는 파일을 찾으려면 입력해야합니다 *.*.*.
ctrl-alt-delor

답변:


705

당신은 사용할 수 있습니다 *; 필요가 없습니다 *.*. 파일 확장자는 유닉스에서 특별하지 않습니다. *점을 포함하여 0 개 이상의 문자와 일치합니다. 따라서 foo.png0 개 이상의 문자 (7 개는 정확하기 때문에)와 일치합니다.

참고 *(어느 쪽도하지 않습니다 기본적으로 점으로 시작하는 파일과 일치하지 않습니다 *.*). 이것은 종종 당신이 원하는 것입니다. 그렇지 않다면, bash에서 그렇게하면 shopt -s dotglob(하지만 여전히 제외 .하고 ..). 다른 쉘은 도트 파일을 포함하는 다른 방법을 갖거나 전혀 사용하지 않습니다.

또는 전체 디렉토리 트리를 한 번에 수행 zip하는 -r(재귀 적) 옵션이 있습니다 (도트 파일 문제에 대해 걱정할 필요가 없습니다).

zip -r myfiles.zip mydir

mydir파일이 들어있는 디렉토리는 어디에 있습니까 ? 생성 된 zip에는 파일뿐만 아니라 디렉토리 구조도 포함됩니다. peterph가 그의 의견에서 지적했듯이, 이것은 일반적으로 좋은 것으로 보입니다 : zip을 추출하면 추출 된 모든 파일이 하나의 하위 디렉토리에 깔끔하게 저장됩니다.

-j/ --junk-paths옵션으로 경로를 저장하지 않도록 zip에 지시 할 수도 있습니다.

zip명령에는 모든 (다수) 옵션에 대해 설명하는 설명서가 제공됩니다. man zip해당 문서를 보려면 입력 하십시오. 이것은 독특합니다. 이 방법으로 대부분의 명령에 대한 설명서를 얻을 수 있습니다.


9
압축을 풀 때 현재 디렉토리를 오염시키지 않도록 아카이브의 모든 것을 최상위 디렉토리에 포함시키는 것이 좋습니다.
peterph

@peterph 완료. tarfiles보다 압축 파일의 규칙은 적지 만 두려워합니다.
derobert

불행히도 그렇습니다. 아마도 데스크톱으로 드래그 앤 드롭하는 Windows 유산과 소스 코드 작업의 Linux 유산으로 인해 발생했을 수 있습니다.
peterph

2
있다는 사실을 숙지 *쉘 - 대체 (globbing)가 dotfiles를 포함하지 않습니다 (예. 파일 이름으로 시작 .). 이것은 전체 디렉토리를 이름으로 압축하는 또 다른 이점입니다.
mrb

그러나 -r을 사용하면 디렉토리 자체가 포함되어있어 내가하고있는 일이 중단됩니다. * 포함하지 않을까요 ...?
tkbx

11

필자의 경우 각 파일을 자체 아카이브에 압축하고 싶었으므로 다음을 수행했습니다 ( zsh).

$ for file in *; do zip ${file%.*}.zip $file; done

1
더 없어 mkv여기? 또한 여기에 특별한 것은 없습니다 zsh. 파일 이름을 포함하는 변수를 올바르게 인용하려면 zip "${file%.*}.zip" "$file"두 변수 주위에 큰 따옴표를 사용하십시오.
tripleee

1
@tripleee 첫째,에 대한 잘못된 참조를 지적 해 주셔서 감사합니다 mkv. 둘째, zsh와 달리 인수 인용은 불필요 bash합니다. 그렇기 때문에이 명령이에 대한 명령임을 지정했습니다 zsh.
Radon Rosborough

마지막 세미콜론을 앰퍼샌드로 바꾸면 속도가 상당히 빨라질 수 있습니다 (디렉토리의 파일 수가 합리적인 경우 ...). 그렇지 않으면 find . -type f -maxdepth 1 -print0|xargs -r0 -n1 -P64 -I{} bash -c 'f="{}"; zip "${f%.*}.zip" "$f"'( -PCPU 스레드에 따라 조정 된 상태에서 ...) (많은 GNU 종속성 ...)
Gert van den Berg

5

또 다른 방법은 find와 xargs를 사용하는 것입니다 : (zip에 "."디렉토리가 포함될 수 있지만 여전히 올바르게 추출되어야합니다. 내 테스트에서는 압축 전에 압축 점을 제거했습니다) find . -type f -exec zip zipfile.zip {} +

( 버전이 exec 의 끝을 지원하지 않으면 +로 대체 할 수 있습니다 .하지만 속도가 느려집니다 ...)\;find+

기본적으로 모든 하위 디렉토리가 포함됩니다. GNU에서 find -maxdepth는이를 방지 할 수 있습니다.


(를 사용하는 솔루션과 달리 *여기에는 도트 파일이 포함되며 디렉토리에 파일이 너무 많으면 넘어지지 않습니다)
Gert van den Berg

1

이것을 수행하는 또 다른 (느린) 방법 (한 번에 하나의 파일을 zip에 추가) :

for f in * .[^.]*; do
    [ -r "$f" ] || continue # Skip directories or non-existant files (Probably ".[^.]*" if directory has no dotfiles). Using -e will allow directories to be used as well
    zip zipfile.zip "$f" # If directories are included, you probably want to add -r
done

이것은 도트 파일 문제 *(해결 방법 추가)가 있으며 각 파일에 대해 한 번 zip으로 시작하여 아카이브에 추가합니다. 에서 bash, 그것은 대량의 파일을 처리합니다.

다른 대부분의 방법보다 느리지 만 비교적 간단합니다.


1
나는 이것이 받아 들여지는 대답보다 덜 간단하고 느리다고 말하면서 "왜 이런 짓을 하는가?"라는 질문을하게됩니다. 당신이 그 질문에 대답 할 수 있다면, 나는 당신의 대답에 그 맥락을 두는 것이 좋습니다. 그렇지 않으면 이미 좋은 대답을 가진 오래된 질문에 대한 나쁜 대답이라고 생각합니다.
Centimane

@Centimane : 제한 사항에 주목합니다. 나는 이것이 교육적 가치가 있다고 생각합니다. (디렉토리를 건너 뛰지 않으면 아주 간단합니다). 대신 (표준) 외부 도구를 사용하여 훨씬 빠른 답변을 원한다면 다른 답변이 그 것을 다룹니다 . (도트 파일 처리가 제거 된 상태에서 (질문에 언급되지 않은 정확성에 영향을 미침) 매우 우아하다고 생각합니다)for f in *; do zip zip.zip "$f"; done
Gert van den Berg

1
허용되는 답변은 외부 명령을 사용하지 않으며 더 빠릅니다. 이 시나리오는 어떤 시나리오에서 유용합니까?
Centimane

@Centimane bash가 매개 변수로 전달할 수있는 것보다 많은 파일이있는 경우 tar를 사용하십시오. (find + xargs가 더 좋고, for 루프가 더 쉽다 ...). 질문에 대한 (고유 한) 답변입니다. 최적의 대답은 아닙니다. (예를 들어 tar 파일을 디렉토리에 넣고 싶은 사람이 약간 다른 상황이있는 경우에도 최적의 답변이 아닌 유사한 문제에 유용 할 수 있습니다.)
Gert van den Berg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.