以不同于文件系统中使用的编码的字符编码解压文件名

Psy*_*aut 8 tar character-encoding filenames unicode

我偶尔会得到 tarball,其中文件名以 ISO-8859-1 或其他一些 pre-Unicode 方案编码。我的系统使用 UTF-8,所以当我使用常用​​选项 ( tar xvf foo.tar)解压这些档案时,我最终会得到一个充满 mojibake 文件名的目录。

到目前为止,我一直在使用在提取convmv文件名后将文件名转换为 UTF-8 。这有点不方便,因为我要么需要convmv在每个受影响的文件上调用,要么将文件解压缩到一个新目录中,convmv在整个目录上运行,然后将文件移动到我最初想要它们的位置。如果没有将此功能编码到 shell 脚本中,是否有某种方法可以将存档文件名即时转换为 UTF-8,因为它们正在解压缩?

Tho*_*ker 12

这是一个小tar文件提取器,可以在提取之前修改内存中的名称:

#!/usr/bin/python27

import tarfile

def transform(data):
    u = data.decode('latin1')
    return u.encode('utf8')

tar = tarfile.open('archive.tar')
for m in tar.getmembers():
    m.name = transform(m.name)

tar.extractall()
Run Code Online (Sandbox Code Playgroud)

警告:与 GNU 不同tar,此提取器不会剥离前导/. 向此提取器添加检查逻辑或tar在使用tar -t.