완전히 패치 워크와 빠르고 대략적인 스케치이지만 3000 개의 파일이있는 디렉토리에서 테스트 한 결과 아래 스크립트는 매우 빠른 작업을 수행했습니다.
#!/usr/bin/env python3
import subprocess
import os
import sys
splitinto = 2
dr = sys.argv[1]
os.chdir(dr)
files = os.listdir(dr)
n_files = len(files)
size = n_files // splitinto
def compress(tar, files):
command = ["tar", "-zcvf", "tarfile" + str(tar) + ".tar.gz", "-T", "-", "--null"]
proc = subprocess.Popen(command, stdin=subprocess.PIPE)
with proc:
proc.stdin.write(b'\0'.join(map(str.encode, files)))
proc.stdin.write(b'\0')
if proc.returncode:
sys.exit(proc.returncode)
sub = []; tar = 1
for f in files:
sub.append(f)
if len(sub) == size:
compress(tar, sub)
sub = []; tar += 1
if sub:
# taking care of left
compress(tar, sub)
사용하는 방법
번호가 매겨진 .tar.gz
파일은 파일이있는 디렉토리와 동일한 디렉토리에 작성됩니다.
설명
스크립트 :
- 디렉토리의 모든 파일을 나열합니다
- tar 파일에 경로 정보를 추가하지 못하도록 디렉토리에 cd
- 파일 목록을 읽고 세트 구분으로 그룹화합니다.
- 하위 그룹을 번호가 매겨진 파일로 압축
편집하다
MB 단위 크기로 청크 자동 생성
청크의 최대 크기 (MB)를 (두 번째) 인수로 사용하는 것이 더 정교합니다. 아래 스크립트에서 청크는 임계 값에 도달 (통과)하자마자 압축 파일에 기록됩니다.
스크립트는 청크에 의해 트리거되므로 임계 값을 초과하므로 (모든) 파일의 크기가 청크 크기보다 실질적으로 작은 경우에만 작동합니다.
스크립트 :
#!/usr/bin/env python3
import subprocess
import os
import sys
dr = sys.argv[1]
chunksize = float(sys.argv[2])
os.chdir(dr)
files = os.listdir(dr)
n_files = len(files)
def compress(tar, files):
command = ["tar", "-zcvf", "tarfile" + str(tar) + ".tar.gz", "-T", "-", "--null"]
proc = subprocess.Popen(command, stdin=subprocess.PIPE)
with proc:
proc.stdin.write(b'\0'.join(map(str.encode, files)))
proc.stdin.write(b'\0')
if proc.returncode:
sys.exit(proc.returncode)
sub = []; tar = 1; subsize = 0
for f in files:
sub.append(f)
subsize = subsize + (os.path.getsize(f)/1000000)
if subsize >= chunksize:
compress(tar, sub)
sub = []; tar += 1; subsize = 0
if sub:
# taking care of left
compress(tar, sub)
실행하려면
python3 /path/tocompress_split.py /directory/with/files/tocompress chunksize
... chunksize는 tar 명령 의 입력 크기입니다 .
여기에는 @DavidFoerster가 제안한 개선 사항이 포함되어 있습니다. 감사합니다 많이 !
tar
파일을 모두 가질 때까지 특정 패턴으로 시작하는 모든 파일을 추가하여 파일을 추가 할 수 있습니다. 이 스크립트는 쉽게 스크립팅 할 수 있지만 필요에 따라 크기가 9MB보다 작다는 보장은 없습니다. 그러나 너무 큰 파일을 더 분할하여 크기를 수동으로 조정할 수 있습니다.