zip 명령을 사용하여 지정된 디렉토리의 모든 파일을 압축하는 방법이 있습니까? *.*를 사용한다고 들었지만 확장자가없는 파일에서도 작동하기를 원합니다.

댓글

  • 원하는 디렉토리에서 한 단계 위로 이동하여 zip myarch.zip mydir/*를 수행해 보셨습니까?
  • 이상 zip -r myarch.zip mydir/*
  • 이상 zip -r myarch.zip mydir
  • *.*는 점이있는 모든 파일을 의미합니다. cp / m 및 dos 모든 파일에 점이있어서 입력하도록했습니다 (*를 할 수 없음). 따라서 사람들이 *.*를 모든 파일로 사용했습니다. 결국 Microsoft는 0 개 이상의 점을 포함 할 수있는 긴 파일 이름을 추가했습니다. 창에 점이있는 파일을 찾으려면 *.*.*를 입력해야합니다.

li>

답변

* 만 사용할 수 있습니다. *.* 용. 파일 확장자는 Unix에서 특별하지 않습니다. *는 0 개 이상의 채널과 일치합니다. aracters— 점 포함. 따라서 0 개 이상의 문자 (정확히 7 개)이므로 foo.png와 일치합니다.

*는 기본적으로 점으로 시작하는 파일과 일치하지 않습니다 (*.*도 일치하지 않음). 이것은 종종 당신이 원하는 것입니다. 그렇지 않은 경우 bash에서 shopt -s dotglob 경우 수행됩니다 (그러나 ...). 다른 셸에는 도트 파일을 포함하는 방법이 다르거 나 전혀 없습니다.

또는 zip에도 -r (재귀 적) 옵션으로 전체 디렉토리 트리를 한 번에 수행 (dotfile 문제에 대해 걱정할 필요 없음) :

zip -r myfiles.zip mydir 

여기서 mydir는 파일이 포함 된 디렉토리입니다. 생성 된 zip 파일에는 디렉토리 구조와 파일이 포함됩니다. peterph가 자신의 의견에서 지적했듯이 이것은 일반적으로 좋은 것으로 간주됩니다. zip을 추출하면 추출 된 모든 파일이 하나의 하위 디렉토리에 깔끔하게 저장됩니다.

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

zip 명령은 모든 (많은) 옵션에 대해 설명하는 문서; 해당 문서를 보려면 man zip를 입력하세요. 이것은 zip에만 국한된 것이 아닙니다. 이러한 방식으로 대부분의 명령에 대한 문서를 얻을 수 있습니다.

코멘트

  • 추가 할 수 있습니다. 아카이브의 모든 것을 최상위 디렉토리에 포함하는 것이 좋습니다. 따라서 추출시 현재 디렉토리를 오염시키지 않도록 ' 있습니다.
  • @peterph 완료. zip 파일에서는 tarfiles보다는 zip 파일의 관습이 적지 만 ' 안타깝습니다.
  • 안타깝게도 그렇습니다. 아마도 창 때문일 것입니다. 드래그의 유산 ' n ' 소스 코드로 작업하는 데스크톱 및 Linux 유산에 드롭합니다.
  • 유지 * shell-globbing은 ' 도트 파일 (예 : .). 이것은 전체 디렉토리를 이름으로 압축하는 또 다른 이점입니다.
  • 그러나 -r을 사용하면 디렉토리 자체가 포함되어 I '하고 있습니다. ' *는 ...를 포함하지 않습니까?

답변

제 경우에는 각 파일을 자체 아카이브에 압축하고 싶었 기 때문에 다음을 수행했습니다 (zsh) :

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

댓글

  • 저기 ' 여기에 mkv가 없습니까? 또한 여기에는 특별히 zsh 특정 항목이 없습니다. ' 파일 이름이 포함 된 모든 변수를 올바르게 인용하기를 원하므로 zip "${file%.*}.zip" "$file" 두 변수를 큰 따옴표로 묶습니다.
  • @tripleee 먼저 mkv에 대한 잘못된 언급을 지적 해 주셔서 감사합니다. 둘째, bash와 달리 zsh에서는 인용 인수가 필요하지 않습니다. 이것이 '이 명령을 zsh에 대한 명령이라고 지정한 이유입니다.
  • 마지막 세미콜론을 앰퍼샌드는 속도를 크게 높일 수 있습니다 (디렉토리의 파일 수가 합당한 경우 …). 그렇지 않으면 find . -type f -maxdepth 1 -print0|xargs -r0 -n1 -P64 -I{} bash -c 'f="{}"; zip "${f%.*}.zip" "$f"' (CPU 스레드에 따라 -P가 조정 됨 …) (많은 GNU 종속성 …)
  • 각 파일을 자체 아카이브로 압축하려면 gzip *

답변

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

(+\; 사용중인 find 버전이 exec에 대한 + 끝을 지원하지 않는 경우, 속도가 느려집니다 …)

기본적으로 모든 하위 디렉토리가 포함됩니다. GNU에서 -maxdepth를 찾을 수 있습니다.

댓글

  • (

    , 여기에는 dotfile이 포함되며 ' 디렉토리에 파일이 너무 많은 경우 넘어지지 않습니다.

Answer

이 작업을 수행하는 또 다른 (느린) 방법 (한 번에 하나의 파일을 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 

여기에는 *의 dotfile 문제가 있으며 (해결 방법이 추가됨) 각 파일에 대해 한 번씩 zip을 시작하여 아카이브에 추가합니다. bash에서는 많은 양의 파일을 처리합니다.

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

댓글

  • 허용되는 답변보다 덜 간단하고 느리기 때문에 질문이 표시됩니다. " 누군가이 작업을 수행하는 이유는 무엇입니까? ". 그 질문에 대답 할 수 있다면 그 맥락을 대답에 넣는 것이 좋습니다. 그렇지 않으면 이미 좋은 대답이있는 오래된 질문에 대한 잘못된 대답이라고 생각합니다.
  • @Centimane : 한계에 주목합니다. . 교육적 가치가 있다고 생각합니다. (디렉토리를 건너 뛰지 않으면 아주 간단합니다). 대신 (표준) 외부 도구를 사용하여 훨씬 더 빠른 답변을 원한다면 다른 답변 을 참조하세요. (점 파일 처리가 제거되었으므로 (질문에 언급 된 부재없이 정확성에 영향을 미침) 매우 우아하다고 생각합니다. for f in *; do zip zip.zip "$f"; done
  • 대답은 ' 외부 명령을 사용하지 않으며 더 빠릅니다. 어떤 시나리오에서이 답변이 유용할까요?
  • @Centimane bash가 매개 변수로 전달할 수있는 것보다 많은 파일이있을 때 tar를 사용합니다. (find + xargs가 더 좋고 for 루프가 더 쉽습니다 …). 질문에 대한 (고유 한) 답변입니다. 확실히 최적의 대답은 아닙니다. (누군가가 약간 다른 상황에있는 경우 (예 : tar 파일이있는 디렉토리를 원하는 경우) 유사한 문제에 대해 최적이 아닌 답변이 여전히 유용 할 수 있습니다.)

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다