web-dev-qa-db-ja.com

tarを抽出します「開くことができません:ファイル名が長すぎます」

リモートマシン上のディレクトリを使用してtarを作成しました。

_tar -czvf
_

私はそれをローカルマシンにscpし、そこで解凍したいと思いました。

_tar -xzvf
_

しかし、私は得る:_Cannot open: File name too long_

Lubuntu 12.04のローカルマシンには、tar (GNU tar) 1.26があります。

現在、リモートマシンにアクセスできません。必要に応じて、後でバージョンを確認します。

特にリモートマシンがオフラインであるため、新しいtarを作成せずに抽出したいと思います。

ちなみに、長い名前にもかかわらず適切なアーカイブを作成する方法を知っている場合は、それを取り上げます。

4
mthpvg

tarはファイル名を256バイトに制限します(GNU拡張子付き)。Linuxファイルシステムはファイル名ごとに少なくとも256バイトをサポートします。つまり、tarによってパックされたファイルはエラーなしで抽出できます。したがって、私は推測します。 2つの原因:

  1. Tarballが破損しています。次の方法で確認してください。

    _$ tar -tvf tarball.tar
    _

    もしあれば、いくつかのエラーが表示されます。

  2. fusecompress または ecryptfs (選択的なファイル圧縮/暗号化を使用)などの「仮想」ファイルシステムを使用していて、ファイル名がファイルシステムの制限より少し短いか等しい。秘訣は、(たとえば)fusecompressを使用してディレクトリをマウントし、ファイル名_foo.bar_を作成する場合、仮想ファイルシステムは_foo.bar.gz_というファイルを作成し、それを透過的に圧縮しますが、実際のファイル名は非表示にします。また、254バイトの長さのファイルを作成すると、接尾辞を追加しようとするため、エラーが発生します。

    この場合、仮想ファイルシステムの外部にtarballを抽出するだけで、次のことが役立つはずです。

    _$ Sudo mkdir /home/${USER}-temp
    $ Sudo chown $USER /home/${USER}-temp
    $ tar -xvf tarball.tar -C /home/${USER}-temp
    _

とにかく、それをトレースして詳細を取得します。

_$ strace -o tar-strace.log tar -tf tarball.tar
$ ltrace -o tar-ltrace.log tar -tf tarball.tar
_
6

これがファイルを保存するための私の回避策です。 tarを抽出するときに、次のオプションを追加します。

  • --xform '/ sed/expression /'を使用して、長い名前を省略します。
  • すべてのアーカイブではなく、問題のあるファイルのみを抽出するには、-T file_with_names_listを使用します。

例:

長いファイル名を/tmp/missing.txtに最初に置きます。

tar -x -T /tmp/missing.txt --xform 's/Beethoven-.*\.flac/B.flac/g' -f backup/home.tar

私の場合、問題のあるファイルはすべてメタ情報付きのオーディオトラックに番号が付けられていたため、名前の一部を切り抜くことは問題のようには見えませんでした。元のファイル名を復元する方法を考える必要があるかもしれません。

1
caujka