Python:如何使用tarfile模块打包时排除第三个目录

0 投票
1 回答
1148 浏览
提问于 2025-04-18 06:42

我有这样的文件夹结构:

-- jenkins
|-- jobs
|   |-- dir1
|   |   |-- build_dir--
|   |   `-- Autoyes
|   |-- dir2
|   |   |-- build_dir--
|   |   `-- Manyes
|   |-- dir3
|   |   |-- ArtFict
|   |   `-- build_dir--
|   `-- hi
|-- tesst
`-- tets

我想用tarfile模块来打包一个tar文件,但要把所有dir1、dir2、dir3及其他文件夹下的"build_dir"排除在外。
我可以用一个很简单的tar命令在子进程中做到这一点:

tar --exclude="*/*/buid_dir" -czvf test.tgz jenkins

但是我想用更“python风”的方式来实现,目前为止我做的还没有把“build_dir”文件夹排除掉。

import tarfile
import os,sys
import subprocess

def ProcesS (input):
    Asub = subprocess.Popen (input,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    output,error = Asub.communicate()
    return output,error

A = ['jenkins', 'jenkins/jobs', 'jenkins/jobs/dir1', 'jenkins/jobs/dir1/build_dir', 'jenkins/jobs/dir2', 'jenkins/jobs/dir2/build_dir', 'jenkins/jobs/dir3', 'jenkins/jobs/dir3/build_dir']

Tar = tarfile.open('Backme.tgz','w:gz')

#Tar.add(A,exclude='*/*/build_dir')   #This throws the error

Tar.add(A)     # creates a tar file without excluding the build_dir 
Tar.close()

如果有人能找到这个问题的答案,那就太好了。

1 个回答

0

根据文档的内容

TarFile.add(name, arcname=None, recursive=True, exclude=None, filter=None)

看起来你只需要把它添加到排除列表中(你可能需要写上完整的路径...)

看起来你确实需要这样做

tf = tarfile.open("sometar.tar","w")
def excludes_fn(name):
    return "build" in name
tf.add("/base/folder",exclude=excludes_fn)

撰写回答