2

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 ファイルを抽出すると、名前が壊れます。

それを修正または回避する方法はありますか?

4

3 に答える 3

1

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://stackoverflow.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 に名前をデコードし、アーカイブの名前をフィードすることでした。

于 2014-04-03T07:06:33.907 に答える
1

いいえ。tar アーカイブは ascii ファイル名のみをサポートします。この質問を参照してください: Java で国別文字を使用した tar アーカイブを作成しています。よりモダンなデザインの別のフォーマットまたはツールが必要だと思います。

zip タスクにはencoding属性があることに注意してください。おそらくこの形式は機能しますか?

于 2012-09-18T09:06:32.857 に答える
0

Antの開発者メーリングリスト(2009年6月30日2009年7月1日)とASF Bugzilla(36851、53811 )で興味深い情報を見つけました。この問題は古く、よく知られています。すべてのuntar実装がそれをサポートしているわけではないため、主にイデオロギー上の理由で修正されていません。

Bugzillaの問題で言及されているパッチは、リビジョン1350857で適用されています。tarのエントリ名にencodingという名前のコンストラクタがあります。

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

ただし、Tarタスクでは使用されません。そこで、Tarタスクでエンコーディング属性を作成し、変更されたソースからAntを再構築し、エントリ名のエンコーディングとしてUTF-8を使用しました。

抽出はUbuntu11/12とMandrivaでテストされています。

于 2012-09-18T15:15:16.823 に答える