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.zip
은 xyz.tar.bz2
.
Bzip2 압축 출력은 일반적으로 zip 파일보다 훨씬 작습니다. 왜냐하면 후자는 여러 파일에 대해 압축 모드를 사용하지 않기 때문입니다. 그러나 Bzip2 파일에 오류가 발생하면 후속 파일을 복구할 가능성이 적습니다.
출력을 압축하지 않으려면 코드에서 및를 제거하세요 :bz2
..bz2
pip
Python3 환경에 설치한 경우 다음을 수행할 수 있습니다.
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를 사용하여 아카이브를 한 형식에서 다른 형식으로 변환할 수 있습니다..