Como os arquivos podem ser adicionados a um Tarfile com Python, sem adicionar a hierarquia do diretório?

StackOverflow https://stackoverflow.com/questions/2239655

  •  19-09-2019
  •  | 
  •  

Pergunta

Quando eu invoco add() com um tarfile Objeto com um caminho de arquivo, o arquivo é adicionado ao Tarball com a hierarquia de diretório associada. Em outras palavras, se eu descompactar o Tarfile, os diretórios na hierarquia de diretórios originais serão reproduzidos.

Existe uma maneira de simplesmente adicionar um arquivo simples sem informações de diretório que incapaz do tarball resultante produz uma lista plana de arquivos?

Foi útil?

Solução

You can use tarfile.addfile(), in the TarInfo object, which is the first parameter, you can specify a name that's different from the file you're adding.

This piece of code should add /path/to/filename to the TAR file but will extract it as myfilename:

tar.addfile(tarfile.TarInfo("myfilename.txt"), open("/path/to/filename.txt"))

Outras dicas

The arch argument of TarFile.add() method is an alternate and convenient way to match your destination.

Example: you want to archive a dir repo/a.git/ to a tar.gz file, but you rather want the tree root in the archive begins by a.git/ but not repo/a.git/, you can do like followings:

archive = tarfile.open("a.git.tar.gz", "w|gz")
archive.add("repo/a.git", arcname="a.git")
archive.close()

Maybe you can use the "arcname" argument to TarFile.add(name, arcname). It takes an alternate name that the file will have inside the archive.

thanks to @diabloneo, function to create selective tarball of a dir

def compress(output_file="archive.tar.gz", output_dir='', root_dir='.', items=[]):
    """compress dirs.

    KWArgs
    ------
    output_file : str, default ="archive.tar.gz"
    output_dir : str, default = ''
        absolute path to output
    root_dir='.',
        absolute path to input root dir
    items : list
        list of dirs/items relative to root dir

    """
    os.chdir(root_dir)
    with tarfile.open(os.path.join(output_dir, output_file), "w:gz") as tar:
        for item in items:
            tar.add(item, arcname=item)    


>>>root_dir = "/abs/pth/to/dir/"
>>>compress(output_file="archive.tar.gz", output_dir=root_dir, 
            root_dir=root_dir, items=["logs", "output"])
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top