【问题标题】:Python tar.add files but omit parent directoriesPython tar.add 文件但省略父目录
【发布时间】:2017-11-08 10:46:28
【问题描述】:

我正在尝试从存储在文本文件中的文件列表创建 tar 文件,我有创建 tar 的工作代码,但我希望从某个目录(应用程序和所有子目录)启动存档,并且删除父目录。这是因为软件只从某个目录打开文件。

package.list 文件如下:

app\myFile app\myDir\myFile app\myDir\myFile2

如果我省略了restore.add 中的路径,由于我的程序从其他地方运行,它无法找到文件。如何告诉 tar 从特定目录开始,或添加文件,但保持从文本文件中获得的目录结构,例如以 app 开头,而不是所有父目录

我的目标是 tar cf restore.tar -T package.list 但在 Windows 上使用 Python。

我从这里尝试过basenameHow to compress a tar file in a tar.gz without directory?,这会删除所有目录。

我也尝试在 .add 方法中使用 arcname='app',但这会破坏目录结构并将文件负载重命名为 app,从而产生一些奇怪的结果

path = foo + '\\' + bar
file = open(path +  '\\package.list', 'r')
restore = tarfile.open(path +  '\\restore.tar', 'w')
for line in file:
    restore.add(path + '\\' + line.strip())
restore.close()
file.close()

使用 Python 2.7

【问题讨论】:

    标签: python python-2.7 tar


    【解决方案1】:

    TarFile.add 可以使用第二个参数,它指定了存档中的名称。

    所以假设每条路径都是健全的,这样的事情会起作用:

    import tarfile
    prefix = "some_dir/"
    archive_path = "inside_dir/file.txt"
    with tarfile.open("test.tar", "w") as tar:
        tar.add(prefix+archive_path, archive_path)
    

    用法:

    > cat some_dir/inside_dir/file.txt
    test
    > python2 test_tar.py
    > tar --list -f ./test.tar
    inside_dir/file.txt
    

    在生产中,我建议使用适当的模块进行路径处理,以确保每个斜杠和反斜杠都在正确的位置。

    【讨论】:

    • 谢谢!一旦我为我的其他代码稍微调整了一下,效果就很好。我在发布之前查看了 TarFile.add 方法,但没有意识到您可以添加第二个参数!
    猜你喜欢
    • 1970-01-01
    • 2010-11-16
    • 2014-07-13
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 2012-07-15
    相关资源
    最近更新 更多