如何从生成的tar文件中排除特定的子文件夹?

问题描述 投票:0回答:1

我正在将Python 3与tarfile模块一起使用来压缩某些文件夹(带有子文件夹)。我需要做的是:设置几个子文件夹,将它们从最终的tar文件中排除。

例如,说我的文件夹看起来像:

dir/
├── subdirA
│   ├── subsubdirA1
│   │   └── fileA11.txt
│   │   └── fileA12.txt
│   ├── subsubdirA2
│   │   └── fileA21.txt
│   │   └── fileA22.txt
│   └── fileA.txt
├── subdirB
│   ├── subsubdirB1
│   │   └── fileB11.txt
│   │   └── fileA12.txt
│   ├── subsubdirB2
│   │   └── fileB21.txt
│   │   └── fileB22.txt
│   └── fileB.txt
└── main.txt

[现在,我说我想在dir/中包括除subsubdirA2subsubdirB2的内容之外的所有内容。基于this answer,我尝试过:

EXCLUDE_FILES = ['/subdirA/subsubdirA2', '/subdirB/subsubdirB2']
mytarfile.add(..., filter=lambda x: None if x.name in EXCLUDE_FILES else x)

或:

EXCLUDE_FILES = ['/subdirA/subsubdirA2/*', '/subdirB/subsubdirB2/*']
mytarfile.add(..., filter=lambda x: None if x.name in EXCLUDE_FILES else x)

或:

EXCLUDE_FILES = ['/subdirA/subsubdirA2/*.*', '/subdirB/subsubdirB2/*.*']
mytarfile.add(..., filter=lambda x: None if x.name in EXCLUDE_FILES else x)

我还尝试了上面三个选项的变体,其中子文件夹路径以/dir/dir开始。没有任何效果-一直以来,dir中的所有内容都包括在内。

如何正确地从要生成的tar文件中排除特定的子文件夹?如果需要一个不同的模块/库而不是tarfile,就可以了。

python python-3.x tar subdirectory tarfile
1个回答
0
投票

我没有找到所需的有关tarfile的参考,但是您可以使用线程并像这样包含shell命令:

import subprocess

exclude=['dir/subdirA/subsubdirA2','dir/subdirA/subsubdirA1','dir/subdirA/text.tx']
excludeline=''
for x in exclude:
    excludeline += ' --exclude '+x
# cmd has tar command
cmd='tar -czvf dir.tar dir  '+ excludeline
print(cmd)
process = subprocess.Popen(cmd,shell=True,stdin=None,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
result=process.stdout.readlines()
# All files were compressed
if len(result) >= 1:
    for line in result:
        print(line.decode("utf-8"))

在此示例中,cmd有价值的地方:

cmd = tar -czvf dir.tar dir   --exclude dir/subdirA/subsubdirA2 --exclude dir/subdirA/subsubdirA1 --exclude dir/subdirA/text.tx
© www.soinside.com 2019 - 2024. All rights reserved.