zip을 파일 시스템으로 추출하지 않고 tar로 변환하는 방법이 있습니까?

zip을 파일 시스템으로 추출하지 않고 tar로 변환하는 방법이 있습니까?

zip먼저 임시 디렉터리로 추출하지 않고 아카이브를 tar아카이브 로 변환하는 방법이 있습니까 ? (그리고 나만 tar의 OR 구현을 작성하지 않고 unzip)

답변1

이제 PyPI에서 설치 가능한 명령으로 사용할 수 있습니다. 이 기사의 끝부분을 참조하세요.


이 작업을 수행하는 "표준" 유틸리티는 모르지만 이 기능이 필요할 때 먼저 디스크에 아무것도 추출하지 않고 ZIP에서 Bzip2 압축 tar 아카이브로 압축하기 위해 다음 Python 스크립트를 작성했습니다.

#! /usr/bin/env python
    
"""zip2tar """

import sys
import os
from zipfile import ZipFile
import tarfile
import time

def main(ifn, ofn):
    with ZipFile(ifn) as zipf:
        with tarfile.open(ofn, 'w:bz2') as tarf:
            for zip_info in zipf.infolist():
                #print zip_info.filename, zip_info.file_size
                tar_info = tarfile.TarInfo(name=zip_info.filename)
                tar_info.size = zip_info.file_size
                tar_info.mtime = time.mktime(tuple(zip_info.date_time) +
                                         (-1, -1, -1))
                tarf.addfile(
                    tarinfo=tar_info,
                    fileobj=zipf.open(zip_info.filename)
                )

input_file_name = sys.argv[1]
output_file_name = os.path.splitext(input_file_name)[0] + '.tar.bz2'

main(input_file_name, output_file_name)

에 저장하여 zip2tar실행 가능하게 만들거나 에 저장 zip2tar.py하고 실행하면 됩니다 python zip2tar.py. ZIP 파일 이름을 스크립트에 대한 인수로 제공하면 출력 파일 이름 xyz.zipxyz.tar.bz2.

Bzip2 압축 출력은 일반적으로 zip 파일보다 훨씬 작습니다. 왜냐하면 후자는 여러 파일에 대해 압축 모드를 사용하지 않기 때문입니다. 그러나 Bzip2 파일에 오류가 발생하면 후속 파일을 복구할 가능성이 적습니다.

출력을 압축하지 않으려면 코드에서 및를 제거하세요 :bz2..bz2


pipPython3 환경에 설치한 경우 다음을 수행할 수 있습니다.

pip3 install ruamel.zip2tar

위의 작업을 수행하는 명령줄 유틸리티를 가져옵니다 zip2tar(면책조항: 저는 이 패키지의 작성자입니다).

답변2

tar명령은 파일 시스템을 처리합니다. 입력은 파일 목록이며, 파일 시스템에서 읽혀집니다(많은 메타데이터 포함). 명령이 tar이를 읽으려면 zip 파일을 파일 시스템으로 제공해야 합니다 .

가상 파일 시스템 - AVFS모든 프로그램에서 표준 파일 시스템 인터페이스를 통해 아카이브 또는 압축 파일의 내부를 볼 수 있습니다.퓨즈.

그 안에 자세한 정보가 있어요avfs-fuse 읽어보기좀 남았어분산 가지다 가방그것을 위해.

AVFS가 설치되어 있으면 다음을 수행할 수 있습니다.

mountavfs
cd ~/.avfs/path/to/somefile.zip#
tar -cvf /path/whatever.tar .

AVFS는 tar가 선택하는 파일 소유권과 같이 zip에서 누락된 파일 시스템에 대한 모든 정보를 채웁니다.

답변3

Linux에는 stdin 및 stdout을 통해 파이프 작업을 위한 훌륭한 도구 세트가 있습니다.

unzip -p ./fzs-2015-03-18.zip | bzip2 > fzs-2015-03-18.bz

임시 파일이 생성되었는지 확인

ps -ef | grep unzip
auser      44260    6666  3 11:18 pts/2    00:00:02 unzip -p ./fzs-2015-03-18.zip
auser      44434   44370  0 11:19 pts/1    00:00:00 grep --color=auto unzip


lsof -p 44260
COMMAND   PID  USER   FD   TYPE DEVICE  SIZE/OFF    NODE NAME
unzip   44260 auser  cwd    DIR  259,6      4096 3015712 /home/auser/Documents/shares/logs
unzip   44260 auser  rtd    DIR  259,5      4096       2 /
unzip   44260 auser  txt    REG  259,5    178072  680357 /usr/bin/unzip
unzip   44260 auser  mem    REG  259,5   3040368  744942 /usr/lib/locale/locale-archive
unzip   44260 auser  mem    REG  259,5   2146832  666811 /usr/lib/libc-2.31.so
unzip   44260 auser  mem    REG  259,5     74440  751069 /usr/lib/libbz2.so.1.0.8
unzip   44260 auser  mem    REG  259,5    203056  665072 /usr/lib/ld-2.31.so
unzip   44260 auser    0u   CHR  136,2       0t0       5 /dev/pts/2
unzip   44260 auser    1w  FIFO   0,13       0t0  436437 pipe
unzip   44260 auser    2u   CHR  136,2       0t0       5 /dev/pts/2
unzip   44260 auser    3r   REG  259,6 513348882 3015900 /home/auser/Documents/shares/logs/fzs-2015-03-18.zip



ps -ef | grep bzip2
auser      44262    6666 99 11:18 pts/2    00:06:42 bzip2
auser      45111   44370  0 11:25 pts/1    00:00:00 grep --color=auto bzip2

⟩ lsof -p 44262
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
bzip2   44262 auser  cwd    DIR  259,6     4096 3015712 /home/auser/Documents/shares/logs
bzip2   44262 auser  rtd    DIR  259,5     4096       2 /
bzip2   44262 auser  txt    REG  259,5    38744  655763 /usr/bin/bzip2
bzip2   44262 auser  mem    REG  259,5  2146832  666811 /usr/lib/libc-2.31.so
bzip2   44262 auser  mem    REG  259,5    74440  751069 /usr/lib/libbz2.so.1.0.8
bzip2   44262 auser  mem    REG  259,5   203056  665072 /usr/lib/ld-2.31.so
bzip2   44262 auser    0r  FIFO   0,13      0t0  436437 pipe
bzip2   44262 auser    1w   REG  259,6 97325056 3015902 /home/auser/Documents/shares/logs/fzs-2015-03-18.bz
bzip2   44262 auser    2u   CHR  136,2      0t0       5 /dev/pts/2

파이프 |만큼은436437 pipe

매우 간단합니다.

이것을 stdin을 통해 파이프된 입력을 허용하는 다른 유틸리티 bzip2로 대체할 수 있습니다.gzip

zip 파일에는 수천 개의 텍스트 파일이 포함되어 있습니다.

답변4

libarchive 사용 bsdtar:

bsdtar -zcf file.tar.gz @file.zip

~에서수동:

tar는 스트림 아카이브를 생성하고 조작합니다. 구현은 tar, pax, cpio에서 추출할 수 있습니다.압축, jar, ar, xar, rpm, 7-zip 및 ISO 9660 CDROM 이미지를 생성할 수 있습니다.아스팔트, pax, cpio, ar, zip, 7-zip 및 shar 아카이브.

@archive
( 모드 c전용 r) 지정된 아카이브가 열리고 해당 항목이 현재 아카이브에 추가됩니다. 간단한 예를 들자면,

tar -c -f - newfile @original.tar

newfile 파일 및 의 모든 항목을 포함하는 새 아카이브를 표준 출력에 씁니다 original.tar. 대조적으로,

tar -c -f - newfile original.tar

항목이 두 개만 있는 새 아카이브를 만듭니다. 비슷하게,

tar -czf - --format pax @-

표준 입력에서 아카이브를 읽고(해당 형식은 자동으로 결정됨) 표준 출력에서 ​​gzip으로 압축된 pax 형식 아카이브로 변환합니다. 이러한 방식으로 tar를 사용하여 아카이브를 한 형식에서 다른 형식으로 변환할 수 있습니다..

관련 정보