从 Ant tar 任务打包的 .tar.gz 中提取时包含非拉丁字符的文件名的编码

Posted

技术标签:

【中文标题】从 Ant tar 任务打包的 .tar.gz 中提取时包含非拉丁字符的文件名的编码【英文标题】:Encoding of filenames containing non-latin characters while extracting from .tar.gz packed by Ant tar task 【发布时间】:2012-09-17 09:33:15 【问题描述】:

我正在使用 Ant 构建一个 tar.gz 存档:

<tar destfile="$linux86.zip.file" compression="gzip" longfile="gnu">
    <tarfileset dir="$work.dir/data" dirmode="755" filemode="755"  
                prefix="$app.folder/data"/>
</tar>

存档是在 Windows 上构建的。在 Ubuntu 12 上提取名称包含非拉丁(例如西里尔字母)字符的文件后,名称已损坏。

有什么办法可以解决这个问题吗?

【问题讨论】:

【参考方案1】:

没有。 Tar 档案仅支持 ascii 文件名。看到这个问题:Creating tar archive with national characters in Java。我认为您需要另一种格式或工具,具有更现代的设计。

注意zip task 有encoding 属性,也许这种格式可以工作?

【讨论】:

我们使用 tar/gzip 来保留权限。不幸的是,我不能按照你的建议使用 zip。 我明白了。如果这值得,您可以分析在 Ubuntu 上创建的 tar 的内容。然后编写一个程序来编辑 Windows tar 并将文件名转换为适合 Ubuntu 的格式。或者开发自定义解压缩任务来进行文件名转换。焦油格式文档链接自我上面链接的答案。 有人在 Python 中做了类似的事情:superuser.com/questions/60379/…【参考方案2】:

我找到了解决方案there,非常感谢 Jarekczek,但我没有正确解码名称。我将脚本修复如下:

#!/usr/bin/env python

# Huge thanks to https://superuser.com/questions/60379/how-can-i-create-a-zip-tgz-in-linux-such-that-windows-has-proper-filenames#190786
# and http://***.com/questions/12456560/encoding-of-filenames-containing-non-latin-characters-while-extracting-from-tar
import tarfile
import codecs
import sys

def recover(name):
    return codecs.decode(name, 'cp1251')

for tar_filename in sys.argv[1:]:
    tar = tarfile.open(name=tar_filename, mode='r', bufsize=16*1024)
    updated = []
    for m in tar.getmembers():
        m.name = recover(m.name)
        updated.append(m)
    tar.extractall(members=updated)
    tar.close()

我所做的是使用 Python 的标准库编解码器和命令行界面将名称从 Windows 解码为 utf,以向其提供档案的名称。

【讨论】:

【参考方案3】:

我在 Ant 的开发者邮件列表(30 Jun 2009、01 Jul 2009)和 ASF Bugzilla(36851、53811)中发现了一些有趣的信息。这个问题很老而且众所周知,主要是出于意识形态的原因,它没有得到解决,因为并非所有的 untar 实现都支持它。

Bugzilla 问题中提到的补丁已应用于修订版1350857。 tar 中的条目名称有一个编码名称的构造函数:

public TarOutputStream(OutputStream os, String encoding)  ... 

但它从未在 Tar 任务中使用过。所以我在 Tar 任务中做了一个编码属性,从修改后的源代码中重建 Ant,并使用 UTF-8 作为条目名称的编码。

在 Ubuntu 11/12 和 Mandriva 下测试提取。

【讨论】:

很高兴您找到了解决方案。我想发布更多信息,但你更快。无论如何,这是与您的问题相关的另一个错误条目。如果我没看错的话,ant 1.9 中可能有某种编码支持,由longfile="posix" 触发。 Bug 53921.

以上是关于从 Ant tar 任务打包的 .tar.gz 中提取时包含非拉丁字符的文件名的编码的主要内容,如果未能解决你的问题,请参考以下文章

打包压缩_任务计划_日志

linux安装ant

Linux中文档的压缩和打包

RHCSA-A13. 创建归档打包压缩文件夹

在Linux上安装ant环境

linux中打包备份脚本,手动执行可以正常打包,使用crontab -e 添加到系统定时任务中执行就无法打包