完全にパッチワークであり、迅速でラフなスケッチはそのままですが、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)を(2番目の)引数として使用することです。以下のスクリプトでは、チャンクがしきい値に達するとすぐにチャンクが圧縮ファイルに書き込まれます。
スクリプトはチャンクによってトリガーされ、しきい値を超えるため、(すべての)ファイルのサイズがチャンクサイズよりも大幅に小さい場合にのみ機能します。
スクリプト:
#!/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未満になることを保証しません。ただし、大きすぎるファイルをさらに分割することで、サイズを手動で調整できます。