从包含500000个文件的目录中创建许多tar文件

fabian789

我有一个包含约500k文件的目录,并想将它们切成ttar文件。

把正式,让我们叫的文件file_0, ..., file_{N-1},其中N围绕500K。我想创建t每个包含T=N/t文件的tar文件,其中第i个tar文件包含

file_(i*N), ..., file_((i+1)*N - 1),    i in {0, ..., t-1}

什么是有效的方法?我打算编写一个Python脚本,该脚本仅循环遍历N文件并将它们划分为t文件夹,然后tar在每个文件夹中调用,但这感觉不是很理想。我在服务器上有很多核心,觉得应该并行发生。

洛索(A. Loiseau)

您可以使用pythonconcurrent库,该库旨在处理所有或某些线程之间的请求队列,直到所有作业完全执行后才占用队列。

  1. 生成文件列表的大列表,例如 [ [f0..f0-1], [fn..f2n-1]..]
  2. 使用ThreadPoolExecutor清单吃您的计算机拥有的所有许多线程的列表。看起来可能像这样:
import os
import sys
from concurrent.futures import ThreadPoolExecutor
import subprocess
import itertools
import math


def main(p, num_tar_files):
    files = list(split_files_in(p, num_tar_files))
    tar_up = tar_up_fn(p)
    with ThreadPoolExecutor(len(files)) as executor:
        archives = list(executor.map(tar_up, itertools.count(), files))
        print("\n {} archives generated".format(len(archives)))


def split_files_in(p, num_slices):
    files = sorted(os.listdir(p))
    N = len(files)
    T = int(math.ceil(N / num_slices))  # means last .tar might contain <T files
    for i in range(0, N, T):
        yield files[i:i+T]


def tar_up_fn(p):
    def tar_up(i, files):
        _, dir_name = os.path.split(p)
        tar_file_name = "{}_{:05d}.tar".format(dir_name, i)
        print('Tarring {}'.format(tar_file_name))
        subprocess.call(["tar", "-cf", tar_file_name] + files, cwd=p)
        return tar_file_name
    return tar_up


if __name__ == '__main__':
    main(sys.argv[1], int(sys.argv[2]))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在子目录中创建一个包含以 C 开头的文件的 tar.gz 文件

当文件存储在不同目录中时,创建不包含父目录的tar归档文件

如何创建包含目录中所有文件的tar文件

创建不包含父目录的tar归档文件

docker build挂在包含许多文件的目录中

在shell脚本中的指定目录中创建tar文件

是否可以在目录A中运行tar命令,从而从目录C中的文件中在目录B中创建tar归档文件?

创建包含50个文件的50个目录

tar文件列表,但不包含目录结构

Tar Gzip目录中的每n个文件

如何将许多tar.gz文件提取到目录中?

创建tar归档文件时添加目录

Perl tar文件以递归方式创建目录

压缩文件夹名称中没有包含目录的文件夹(tar)

按大小将目录中的m个文件放入n个tar文件中?

在目录中为每个文件创建1个zip文件

在OCaml中创建tar文件

将顶层目录包含到PowerShell创建的zip文件中

我有一个包含许多 .tar.gz 文件的文件夹。在 python 中,我想进入每个文件解压缩或压缩并找到具有我想提取的字符串的文本文件?

处理目录中的许多 XML 文件 (java)

根据tar文件创建目录名称后提取tar

tar:将单个文件提取到目录中而不创建子文件夹

使用脚本为目录中的每个 tar 文件创建内容文件

在构建的 APK 的根目录中包含一个文件

创建包含 10 个文本文件的新目录,并在这些文件中创建 1 个随机数

如何在每个子目录中创建一个文本文件,以便该文本文件包含目录名称

重命名tar归档文件中的目录

php文件包含不同目录中的文件

对于制作的每个文件,我想创建一个包含多个文件夹的目录