효율적으로 gzip 파일을 bzip2로 변환 있습니다. 현재, 나는

때때로 gzip2로 변환 해야하는 gzip 파일이 많이 있습니다. 현재, 나는 단순히 각 파일을 ‘gunzip’한 다음 ‘bzip2’인 쉘 스크립트를 사용하고 있습니다. 이것이 작동하지만 완료 하는 데 많은 시간이 걸립니다.

이 프로세스를보다 효율적으로 만들 수 있습니까? 다이빙을 준비하고 필요한 경우 gunzip 및 bzip2의 소스 코드를 살펴볼 준비가되었지만 그 결과를 확신하고 싶습니다. 프로세스의 효율성을 향상시킬 희망이 있습니까?



답변

이 질문은 오래 전에 pbzip2 를 사용할 수 없거나 stdin에서 압축 할 수 없었던 때에 요청 되었지만 이제 bzip2 대신 parallelpbzip2를 사용하여 압축 해제 단계와 압축 단계를 병렬화 할 수 있습니다 .

ls *.gz | parallel "gunzip -c {} | pbzip2 -c > {.}.bz2"

bzip2를 사용하는 것보다 훨씬 빠릅니다 .


답변

한 단계에서 gunzip과 다른 단계에서 bzip2 대신 파이프를 사용하는 것이 더 효율적인지 궁금합니다. 같은 것gunzip --to-stdout foo.gz | bzip2 > foo.bz2

둘 이상의 CPU로 생각하고 있는데, 이것이 더 빠를 것입니다. 그러나 아마도 단일 코어로도 가능합니다. 그래도 이것을 시도하지 않았다는 것을 부끄럽게 인정합니다.


답변

여러 코어 (또는 여러 머신)가있는 경우 GNU 병렬 ( http://www.gnu.org/software/parallel )이 옵션이 될 수 있습니다.

ls *.gz | parallel "gunzip -c {} | bzip2 > {.}.bz2"

자세한 내용과 옵션은 튜토리얼 / 매뉴얼 페이지를 참조하십시오.


답변

현재하고있는 것이 최선의 방법입니다. 사용 가능한 변환 도구가 없으며 이미 압축 된 파일을 bzip2로 시도하는 것은 바람직하지 않은 효과가 있기 때문에 실제로는 옵션이 아닙니다. 알고리즘이 다르기 때문에 변환에는 관계없이 원본 데이터를 검색해야합니다. 물론 gzipping이 bzip2 프로세스의 한 단계가 아니라면 불행히도 그렇지 않습니다.


답변

때때로 로그 파일을 사용하여 동일한 작업을 수행해야합니다. 가장 작은 * .gz 파일부터 먼저 ( ls -rS), gunzip 및 개별적으로 bzip2로 시작합니다. gunzip 출력을 bzip2 입력으로 직접 전달할 수 있는지 알 수 없습니다. bzip2 명령은 gunzip이 압축 해제 상태보다 압축 속도가 너무 느려서 메모리를 소비하고 호스트의 스왑 공간을 차지할 수 있습니다.

개선이나 제안은 환영합니다. 여기 하나의 라이너가 있습니다 :

for i in $(ls -rS *.gz | sed 's/\.gz//'); do gunzip ${i}.gz; bzip2 -9 ${i}; done

답변

몇 개 이상인 경우 멋진 쉘 스크립트로 LJ 기사를 확인하십시오.

http://linuxgazette.net/123/bechtel.html

7zip은 압축률을 높이고 멀티 스레드입니다.


답변

몇 분 전에이 작업을 수행해야했습니다.

find . -name "*.gz" | perl -pi -e 's/\.gz$//g;' | xargs -n1 ./rezip

어디는 rezip과 같이 정의된다 :

#!/bin/bash
gunzip -v $1.gz && bzip2 -9v $1

선택적으로, -P옵션을 사용하여 멀티 스레드로 만들 수도 xargs있지만 조심하십시오. (낮게 시작하십시오!)