如何向TAR归档根目录添加多文件且不生成包裹目录?
问题
现有目录myfiles包含file1.txt和file2.txt,需将这两个文件打包为.tgz归档,要求解压后文件直接位于归档根目录(而非myfiles目录下)。使用Python内置tarfile库时,添加单个文件可正常实现,但添加多个文件时,归档根目录会生成myArchive目录并包含这两个文件。请问该现象原因是什么?如何实现多文件直接处于归档根目录?
复现步骤
环境信息:Python版本3.10.13,操作系统MacOS 14.1.1 (23B81),CPU架构M2 Pro (arm64)
- 创建上述
myFiles目录及文件; - 运行以下代码并查看归档目录结构:
tar = tarfile.open("myArchive.tgz", 'w:gz') tar.add("myFiles/file1.txt", "file1.txt") tar.add("myFiles/file2.txt", "file2.txt") tar.close()
- 注释其中一条
tar.add()语句后重新运行,观察归档目录结构。
原因分析
这个现象并非代码逻辑问题,而是查看归档时的视觉误解:
你提供的代码本身是正确的,生成的.tgz归档内部,file1.txt和file2.txt本来就直接位于归档根目录,不存在myArchive目录。之所以会产生误解,大概率是解压工具在展示归档内容时,默认将归档文件名(myArchive.tgz)作为临时容器名显示,但这并不是归档内部实际存在的目录。当归档内只有单个文件时,部分工具不会显示这个容器名,因此你误以为单个文件时正常、多个文件时出现了额外目录。
解决方法
代码本身逻辑正确,推荐使用更规范的with语句自动管理归档文件句柄,避免手动关闭可能出现的异常:
import tarfile with tarfile.open("myArchive.tgz", 'w:gz') as tar: # 通过arcname参数指定文件在归档内的路径,直接映射为根目录下的文件名 tar.add("myFiles/file1.txt", arcname="file1.txt") tar.add("myFiles/file2.txt", arcname="file2.txt")
运行后解压myArchive.tgz,file1.txt和file2.txt会直接出现在解压目录的根路径下,不会包含任何额外父目录。
内容的提问来源于stack exchange,提问作者tomigee
相关产品推荐
相关产品推荐

