Lorsque j'appelle add()
sur un objet tarfile
avec un chemin de fichier, le fichier est ajouté à l'archive tar avec la hiérarchie de répertoires associée. En d'autres termes, si je décompresse le fichier tar, les répertoires de la hiérarchie des répertoires d'origine sont reproduits.
Existe-t-il un moyen d'ajouter simplement un fichier brut sans informations de répertoire pour que la décompression de l'archive tar résultante produise une liste plate de fichiers?
Vous pouvez utiliser tarfile.addfile()
, dans l'objet TarInfo
, qui est le premier paramètre, vous pouvez spécifier un name
c'est différent du fichier que vous ajoutez.
Ce morceau de code devrait ajouter /path/to/filename
dans le fichier TAR mais l'extrayera sous la forme myfilename
:
tar.addfile(tarfile.TarInfo("myfilename.txt"), open("/path/to/filename.txt"))
L'argument Arch de la méthode TarFile.add () est un moyen alternatif et pratique de faire correspondre votre destination.
Exemple: vous souhaitez archiver un répertoire repo/a.git/ dans un tar.gz , mais vous voulez plutôt que la racine de l'arbre dans l'archive commence par a.git/ mais pas repo/a.git/, vous pouvez faire comme suit:
archive = tarfile.open("a.git.tar.gz", "w|gz")
archive.add("repo/a.git", arcname="a.git")
archive.close()
Vous pouvez peut-être utiliser l'argument "arcname" pour TarFile.add (nom, arcname). Il faut un autre nom que le fichier aura à l'intérieur de l'archive.
grâce à @diabloneo, fonction pour créer un tarball sélectif d'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"])