¿Cómo se pueden añadir archivos a un archivo tar con Python, sin añadir la jerarquía de directorios?
Pregunta
Cuando invoco add()
en un objeto tarfile
con una ruta de archivo, el archivo se añade al archivo comprimido con la jerarquía de directorios asociados. En otras palabras, si descomprimir el archivo tar los directorios de la jerarquía de directorios originales se reproducen.
¿Hay una manera de la simple adición de un archivo plano sin información de directorio que desempaquetar el paquete de archivos resultantes producen una lista plana de archivos?
Solución
Puede utilizar tarfile.addfile()
, en el objeto TarInfo
, que es el primer parámetro, puede especificar un name
que es diferente del archivo que 're adición.
Esta pieza de código debe añadir /path/to/filename
en el fichero de alquitrán, sino que va a extraer como myfilename
:
tar.addfile(tarfile.TarInfo("myfilename.txt"), open("/path/to/filename.txt"))
Otros consejos
La arco argumento de TarFile.add () método es una alternativa y una manera conveniente para que coincida con su destino.
Ejemplo: desea archivar un directorio repo / a.git / a un archivo tar.gz , pero más bien desea que la raíz de un árbol en el archivo comienza por a.git / pero no repo / a.git / , se puede hacer como siguientes:
archive = tarfile.open("a.git.tar.gz", "w|gz")
archive.add("repo/a.git", arcname="a.git")
archive.close()
Tal vez se puede usar el argumento "arcname" a TarFile.add (nombre, arcname). Se necesita un nombre alternativo que el archivo tendrá dentro del archivo.
gracias a @diabloneo, función para crear tarball selectiva de un 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"])