한 번에 여러 파일 압축 풀기


27

.zip한 폴더에 200 개 이상의 파일이 있습니다. 나는 그것들을 하나씩 압축 해제하고 싶지 않습니다. 단일 명령이나 스크립트를 사용하여 추출하고 싶습니다. 그렇게하는 방법.

답변:


38

실제로 병렬로 압축을 풀려면 할 수 있습니다

for i in *zip; do unzip "$i" & done

그러나 N .zip 파일에 대해 N 프로세스를 시작하고 시스템에서 매우 무거울 수 있습니다. 한 번에 10 개의 병렬 프로세스 만 실행하는보다 제어 된 접근 방식을 사용하려면 다음을 시도하십시오.

find . -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}

시작된 병렬 프로세스 수를 제어하려면 -P원하는대로 변경하십시오 . 하위 디렉토리로 재귀를 원하지 않으면 대신 다음을 수행하십시오.

find . -maxdepth 1 -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}

또는 @OleTange가 제안한대로 GNU 병렬 을 주석에 설치하고 실행할 수 있습니다

parallel unzip ::: *zip

3
병렬로 실행하는 것이 좋지만 디스크 I / O가 주요 병목 현상이되지 않습니까?
Paddy Landau

1
@PaddyLandau 잘 모르겠습니다. 확인해야합니다. 압축 해제 알고리즘의 속도와 내가 상상 한 디스크의 속도에 달려 있습니다.
terdon

에 배관하는 대신 -exec또는 -execdir을 사용하십시오 xargs. 이해하는 것이 더 간단 할뿐만 아니라 오류가 적고 시스템 리소스를 적게 사용합니다. find . -name '*.zip' -exec unzip {} ';'(반 콜론을 인용해야합니다.)
Paddy Landau

@PaddyLandau 내가 xargs에 파이핑하는 유일한 이유 는 OP가 요청 한대로 병렬 로 실행하는 것입니다 . -exec \;(따옴표없이 세미콜론을 이스케이프 할 수 있음) 각 명령을 순차적으로 실행합니다. -exec +더 좋지만 작동하지 않기 때문에 여기서 unzip작동 하지 않습니다 .
terdon

OP를 다르게 이해했다고 생각합니다. 당신은 그를 병렬로 원하는 것으로 읽었지만, 나는 그를 여러 명령 대신 단일 명령을 의미하는 것으로 이해했습니다. 글쎄, 그는 지금 두 가지 방법을 모두 가지고 있습니다 :)
Paddy Landau

17

GNU 병렬 명령은 잘 것은 이런 종류의에 적합합니다. 후:

$ sudo apt-get install parallel

그때

ls *.zip | parallel unzip

이렇게하면 코어를 모두 사용할 수있을 때까지 각 코어를 압축 해제 상태로 유지합니다.


echo *.zip추가 정보에서 ls 별칭이 몰래 들어 가지 않도록 대신 사용하는 것이 좋습니다 . 그러나 이것은 @Guru의 대답과 같은 문제가 있으며 공백을 포함하는 파일 이름에서 손상됩니다.
nyuszika7h

1
@ nyuszika7h xargsGNU Parallel 과 달리 space / tab / quote를 포함하는 파일 이름은 깨지지 않습니다 . 파일 이름에 줄 바꿈이 포함 된 경우에만 특별한주의를 기울여야합니다. 사용하여 예를 들면 :parallel unzip ::: *.zip
올레 단게

@ nyuszika7h -이 피하기 위해 좋은 이유가 모두 표준 명령을 앨리어싱, 파일 이름에 넣어 공간을.
Wayne Conrad

@ nyuszika7h를 사용하는 echo것은을 사용 하는 것만 큼 나쁩니다 ls. 글 로빙과 while 루프가 가장 안전합니다.
terdon

1
@NateEldredge 시스템에 하나의 자기 디스크 만있을 당시에는 그 기회가 더 커졌지 만 요즘에는 여러 개의 스핀들이있는 RAID와 플래시 디스크가있을 가능성이 더 작습니다. 가장 좋은 점은 측정 방식을 볼 수 물론입니다 당신의 시스템 동작합니다합니다. 필자는 최근 I / O 굶주린 프로세스에 대한 최적 병렬 처리가 10 인 40 스핀들 RAID를 사용했습니다. 10 배속 속도는 제공하지 않았지만 6 배에 불과했지만 10 개 미만의 프로세스는 6 배 미만이었습니다.
Ole Tange

12

다음 명령을 사용할 수 있습니다.

먼저 터미널의 디렉토리를 .zip 파일이 포함 된 디렉토리로 변경하십시오.

cd /path

그런 다음이 명령을 실행하여 모든 .zip 파일을 압축 해제하십시오.

for z in *.zip; do unzip "$z"; done

10

.zip폴더에 많은 파일이 있고 모든 파일을 압축 해제하려면 터미널을 열고 다음을 사용하여 폴더로 이동하십시오.

cd <path_to_folder>

이제이 명령을 사용하여 모든 .zip파일 을 압축 해제 하십시오 :

ls *.zip | xargs -n1 unzip

3
파일 이름에 공백이 있으면 실패합니다.
terdon

1
그래 너가 옳아.
g_p

추가 정보에서 echo *.zip가능한 ls별칭이 몰래 들어 가지 않도록 대신 사용하는 것이 좋습니다 . 그러나 여전히 공백 문제는 해결되지 않습니다.
nyuszika7h

1
@OleTange 눈치 채지 못한 경우 공백이있는 파일 이름에서는 여전히 실패한다고 말했습니다.
nyuszika7h

1
ls출력은 버전간에 잘 정의되어 있지 않으므로 스크립트 의 출력에 의존하지 마십시오 . 대신이 솔루션의 모든 문제를 해결하는 @terdon의 답변을 살펴보십시오.
Paddy Landau

6

find와 -exec같이 사용할 수 있습니다 .

find . -name "*.zip" -exec unzip {} \;

파일 이름에 공백이있는 경우 작동합니다.


3

비 터미널 방식입니다.

zip 파일을 선택하고 마우스 오른쪽 버튼을 클릭 한 다음을 선택하십시오 extract here. 한 번에 전체 또는 다수의 zip 파일을 선택할 수 있습니다.


1

unzip \*.zip 또는 unzip '*.zip'

분명한는 unzip *.zip쉘이 그것을 확장하기 때문에, 일을하지 않는 unzip foo.zip bar.zip ...unzip파일이 zip 파일에서 추출로 zip 파일로 처음 이름 해석, 다음과 같은 파일 이름.

그러나 unzipUnix 명령에서는 자체 확장 기능을 수행한다는 점에서 약간 특이합니다. *쉘에 의해 확장되지 않은 경우 압축을 풀면 결과로 생성되는 모든 파일 이름이 처리 할 zip 파일로 해석됩니다. 따라서이 특별한 경우에는 for루프 등을 사용 하지 않고도 벗어날 수 있습니다 xargs.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.