python - 如何从生成的 tar 文件中排除特定的子文件夹?
问题描述
我正在使用带有tarfile
模块的 Python 3 来压缩一些文件夹(带有子文件夹)。我需要做的:设置几个子文件夹从最终的 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/
除了subsubdirA2
和的内容subsubdirB2
。基于这个答案,我尝试过:
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
,那很好。
解决方案
我没有以您需要的方式找到有关 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
推荐阅读
- javascript - javascript中的设置器
- python - .index can't see an item in a list
- c# - Creating database using already prepared migrations ASP.NET MVC
- ruby - 使用 Capybara 与延迟加载元素进行交互
- python - Libre Calc 'B5' 显示#NAME?使用 OpenPyxl 时
- javascript - 在对象中创建动态键
- angular - 无法从依赖于 Websocket 的共享服务获取数据
- raku - 如何使 Perl 6 类最终?
- php - 从数据库中的一行中选择数据
- excel - VBA Excel for Mac : 复制粘贴