zip
명령을 사용하여 지정된 디렉토리의 모든 파일을 압축하는 방법이 있습니까? *.*
를 사용한다고 들었지만 확장자가없는 파일에서도 작동하기를 원합니다.
댓글
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 파일이있는 디렉토리를 원하는 경우) 유사한 문제에 대해 최적이 아닌 답변이 여전히 유용 할 수 있습니다.)
zip myarch.zip mydir/*
를 수행해 보셨습니까?zip -r myarch.zip mydir/*
zip -r myarch.zip mydir
*.*
는 점이있는 모든 파일을 의미합니다. cp / m 및 dos 모든 파일에 점이있어서 입력하도록했습니다 (*
를 할 수 없음). 따라서 사람들이*.*
를 모든 파일로 사용했습니다. 결국 Microsoft는 0 개 이상의 점을 포함 할 수있는 긴 파일 이름을 추가했습니다. 창에 점이있는 파일을 찾으려면*.*.*
를 입력해야합니다.