답변:
실제로 병렬로 압축을 풀려면 할 수 있습니다
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
-exec또는 -execdir을 사용하십시오 xargs. 이해하는 것이 더 간단 할뿐만 아니라 오류가 적고 시스템 리소스를 적게 사용합니다. find . -name '*.zip' -exec unzip {} ';'(반 콜론을 인용해야합니다.)
-exec \;(따옴표없이 세미콜론을 이스케이프 할 수 있음) 각 명령을 순차적으로 실행합니다. -exec +더 좋지만 작동하지 않기 때문에 여기서 unzip작동 하지 않습니다 .
GNU 병렬 명령은 잘 것은 이런 종류의에 적합합니다. 후:
$ sudo apt-get install parallel
그때
ls *.zip | parallel unzip
이렇게하면 코어를 모두 사용할 수있을 때까지 각 코어를 압축 해제 상태로 유지합니다.
echo *.zip추가 정보에서 ls 별칭이 몰래 들어 가지 않도록 대신 사용하는 것이 좋습니다 . 그러나 이것은 @Guru의 대답과 같은 문제가 있으며 공백을 포함하는 파일 이름에서 손상됩니다.
xargsGNU Parallel 과 달리 space / tab / quote를 포함하는 파일 이름은 깨지지 않습니다 . 파일 이름에 줄 바꿈이 포함 된 경우에만 특별한주의를 기울여야합니다. 사용하여 예를 들면 :parallel unzip ::: *.zip
echo것은을 사용 하는 것만 큼 나쁩니다 ls. 글 로빙과 while 루프가 가장 안전합니다.
.zip폴더에 많은 파일이 있고 모든 파일을 압축 해제하려면 터미널을 열고 다음을 사용하여 폴더로 이동하십시오.
cd <path_to_folder>
이제이 명령을 사용하여 모든 .zip파일 을 압축 해제 하십시오 :
ls *.zip | xargs -n1 unzip
echo *.zip가능한 ls별칭이 몰래 들어 가지 않도록 대신 사용하는 것이 좋습니다 . 그러나 여전히 공백 문제는 해결되지 않습니다.
ls출력은 버전간에 잘 정의되어 있지 않으므로 스크립트 의 출력에 의존하지 마십시오 . 대신이 솔루션의 모든 문제를 해결하는 @terdon의 답변을 살펴보십시오.
unzip \*.zip 또는 unzip '*.zip'
분명한는 unzip *.zip쉘이 그것을 확장하기 때문에, 일을하지 않는 unzip foo.zip bar.zip ...및 unzip파일이 zip 파일에서 추출로 zip 파일로 처음 이름 해석, 다음과 같은 파일 이름.
그러나 unzipUnix 명령에서는 자체 확장 기능을 수행한다는 점에서 약간 특이합니다. *쉘에 의해 확장되지 않은 경우 압축을 풀면 결과로 생성되는 모든 파일 이름이 처리 할 zip 파일로 해석됩니다. 따라서이 특별한 경우에는 for루프 등을 사용 하지 않고도 벗어날 수 있습니다 xargs.