it-swarm-ko.tech

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

Zip 명령으로 주어진 디렉토리의 모든 파일을 압축하는 방법이 있습니까? *.*,하지만 확장명이없는 파일에서도 작동하고 싶습니다.

523
tkbx

*; *.*이 필요하지 않습니다. 파일 확장자는 유닉스에서 특별하지 않습니다. *은 점을 포함하여 0 개 이상의 문자와 일치합니다. 따라서 foo.png과 일치합니다. 왜냐하면 0 개 이상의 문자 (정확히는 7 개)이기 때문입니다.

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

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

Zip -r myfiles.Zip mydir

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

Zip에 -j/--junk-paths 옵션을 사용하여 경로를 저장하지 않도록 지시 할 수도 있습니다.

Zip 명령은 모든 (다수) 옵션에 대한 정보를 제공하는 설명서와 함께 제공됩니다. 해당 설명서를 보려면 man Zip을 입력하십시오. 이것은 Zip만의 고유 한 것이 아닙니다. 이 방법으로 대부분의 명령에 대한 설명서를 얻을 수 있습니다.

753
derobert

제 경우에는 각 파일을 자체 보관소에 압축하고 싶었으므로 다음을 수행했습니다 (zsh).

$ for file in *; do Zip ${file%.*}.Zip $file; done
15
Radon Rosborough

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

(find 버전이 exec에 대해 + 끝을 지원하지 않으면 \;+로 바꿀 수 있습니다. )

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

8
Gert van den Berg

이것을 수행하는 다른 (느린) 방법 (한 번에 하나의 파일을 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에서는 많은 양의 파일을 처리합니다.

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

2
Gert van den Berg