zip
명령을 사용하여 주어진 디렉토리의 모든 파일을 압축하는 방법이 있습니까? 을 사용하는 것에 대해 들었지만 *.*
확장명이없는 파일에서도 작동하고 싶습니다.
답변
당신은 사용할 수 있습니다 *
; 필요가 없습니다 *.*
. 파일 확장자는 유닉스에서 특별하지 않습니다. *
점을 포함하여 0 개 이상의 문자와 일치합니다. 따라서 foo.png
0 개 이상의 문자 (7 개는 정확하기 때문에)와 일치합니다.
참고 *
(어느 쪽도하지 않습니다 기본적으로 점으로 시작하는 파일과 일치하지 않습니다 *.*
). 이것은 종종 당신이 원하는 것입니다. 그렇지 않다면, bash에서 그렇게하면 shopt -s dotglob
(하지만 여전히 제외 .
하고 ..
). 다른 쉘은 도트 파일을 포함하는 다른 방법을 갖거나 전혀 사용하지 않습니다.
또는 전체 디렉토리 트리를 한 번에 수행 zip
하는 -r
(재귀 적) 옵션이 있습니다 (도트 파일 문제에 대해 걱정할 필요가 없습니다).
zip -r myfiles.zip mydir
mydir
파일이 들어있는 디렉토리는 어디에 있습니까 ? 생성 된 zip에는 파일뿐만 아니라 디렉토리 구조도 포함됩니다. peterph가 그의 의견에서 지적했듯이, 이것은 일반적으로 좋은 것으로 보입니다 : zip을 추출하면 추출 된 모든 파일이 하나의 하위 디렉토리에 깔끔하게 저장됩니다.
-j
/ --junk-paths
옵션으로 경로를 저장하지 않도록 zip에 지시 할 수도 있습니다.
이 zip
명령에는 모든 (다수) 옵션에 대해 설명하는 설명서가 제공됩니다. man zip
해당 문서를 보려면 입력 하십시오. 이것은 독특합니다. 이 방법으로 대부분의 명령에 대한 설명서를 얻을 수 있습니다.
답변
필자의 경우 각 파일을 자체 아카이브에 압축하고 싶었으므로 다음을 수행했습니다 ( zsh
).
$ for file in *; do zip ${file%.*}.zip $file; done
답변
또 다른 방법은 find와 xargs를 사용하는 것입니다 : (zip에 “.”디렉토리가 포함될 수 있지만 여전히 올바르게 추출되어야합니다. 내 테스트에서는 압축 전에 압축 점을 제거했습니다)
find . -type f -exec zip zipfile.zip {} +
( 버전이 exec 의 끝을 지원하지 않으면 +
로 대체 할 수 있습니다 .하지만 속도가 느려집니다 …)\;
find
+
기본적으로 모든 하위 디렉토리가 포함됩니다. GNU에서 find -maxdepth
는이를 방지 할 수 있습니다.
답변
이것을 수행하는 또 다른 (느린) 방법 (한 번에 하나의 파일을 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
, 그것은 대량의 파일을 처리합니다.
다른 대부분의 방법보다 느리지 만 비교적 간단합니다.