web-dev-qa-db-ja.com

bz2ファイルと「これはtarアーカイブのようには見えません」

このエラーに関連する他の質問を見たことがあります( tar.gzファイルを抽出すると「これはtarアーカイブのようには見えません。」 など)が、それらを適用する方法がわかりません私の問題に:

まず、ファイルをダウンロードします。

$ wget --no-check-certificate https://wxpython.org/Phoenix/tools/doxygen-1.8.8-linux.bz2
--2017-04-06 15:06:11--  https://wxpython.org/Phoenix/tools/doxygen-1.8.8-linux.bz2
Resolving wxpython.org (wxpython.org)... 85.234.150.54
Connecting to wxpython.org (wxpython.org)|85.234.150.54|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3961996 (3.8M) [application/x-bzip2]
Saving to: ‘doxygen-1.8.8-linux.bz2’

100%[==============================================================================>] 3,961,996    734KB/s   in 5.0s   

2017-04-06 15:06:16 (778 KB/s) - ‘doxygen-1.8.8-linux.bz2’ saved [3961996/3961996]

次に、ファイルのファイルタイプを確認します。

$ file doxygen-1.8.8-linux.bz2 
doxygen-1.8.8-linux.bz2: bzip2 compressed data, block size = 900k

さて、それは「bzip2圧縮データ」です、それを開梱しましょう?:

$ tar xjvf doxygen-1.8.8-linux.bz2
tar: This does not look like a tar archive
tar: Skipping to next header
tar: Archive contains ‘\351\357\377I\211\304H\211’ where numeric mode_t value expected
tar: Archive contains ‘A\270\001\0\0\0H\211ǹ\001’ where numeric time_t value expected
tar: Archive contains ‘\307\350\216v)\0I\307’ where numeric uid_t value expected
tar: Archive contains ‘\004$P\254|\0\2770’ where numeric gid_t value expected
@\2678\350\330\351\357\377\2778
tar: @\2678\350\330\351\357\377\2778: Unknown file type '', extracted as normal file
tar: @�8������8: implausibly old time stamp 1970-01-01 00:59:59
tar: Skipping to next header
tar: Exiting with failure status due to previous errors

そして、私は空のファイルを解凍します:

$ ls -la @�8������8 
-rwxrwxr-x 1 user user 0 Jan  1  1970 @?8??????8

不思議なことに、file-roller(アーカイブマネージャー)を使用してGUIから解凍すると、ファイルが解凍されます。

$ ls -la ~/Desktop/doxygen-1.8.8-linux 
-rw-rw-r-- 1 user user 12283548 Apr  6 15:13 /home/user/Desktop/doxygen-1.8.8-linux
$ file ~/Desktop/doxygen-1.8.8-linux 
/home/user/Desktop/doxygen-1.8.8-linux: ELF 64-bit LSB  executable, x86-64, version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0eccee11d38322d5df3a1723651c2f18303e1188, not stripped

では、ここで何が起こっているのでしょうか。コマンドラインからこれを解凍できないのはなぜですか。コマンドラインを使用してこれを解凍するにはどうすればよいですか。


編集:実際に私はそれを開梱することができます:

$ bzip2 -d doxygen-1.8.8-linux.bz2 
$ file doxygen-1.8.8-linux 
doxygen-1.8.8-linux: ELF 64-bit LSB  executable, x86-64, version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0eccee11d38322d5df3a1723651c2f18303e1188, not stripped

...残りの唯一の質問は、これまでずっと行っていたように、なぜこれにtarを使用できなかったのかということです。

2
sdaau

tarは、圧縮せずにファイルを1つの大きな.tarファイルにコピーするだけです。 bzip2gzipxzは、単一ファイル用のファイルコンプレッサーです。 tarファイル。拡張子は.tar.gz.tar.xz.tar.bz2または.tbz2)、.txz.tgzなどです。

tarは、bzip2、xz、gzipによる圧縮の有無にかかわらず.tarファイルのみを処理できます。しかしnot非tar'ed .bz2.xzアーカイブ。

Tar化されていないbzipファイルはbzip2 -d file.bz2で抽出できます。

22
Michael D.

ファイルが「tarアーカイブのように見えない」理由は、ファイルがtarアーカイブではなく、bzip2で圧縮された単一の実行可能ファイルであるためです。 。これは、fileコマンドの出力と、ファイルのファイル名拡張子が.tar.bz2ではなく、.bz2だけであるという事実からわかります(もちろん、技術的には、ファイルの名前を変更して拡張子を付けることができます)。

tarbzip2 は、目的の異なる別々のレイヤーと考えてください。tarは、さまざまなファイルの束を1つの大きなファイルに結合し、bzip2はファイルを圧縮します(多くの場合、 tar)反復部分をよりコンパクトな方法でエンコードすることにより、反復データを含みます。

Tarは、次の2つの主な理由から、bzip2(または gzip または他の同様のファイル圧縮プログラム)と一緒に使用されることがよくあります。

  1. Tarアーカイブは、多くの場合、反復データが大量に含まれていることが多く、スペースを節約するためにできるだけ小さくすることが望ましいため、bzip2圧縮の優れた候補です。

    また、名前が示すように、tarアーカイブは通常、頻繁にアクセスまたは変更されることが予想されないアーカイブデータに使用されます。したがって、bzip2の圧縮と解凍によってコンテンツへのアクセスと変更が遅くなるという事実は、特に大きな問題ではありません。

  2. 設計上、bzip2(およびgzipなど)は一度に複数のファイルを圧縮することはできません。複数のファイルを含む単一のbzip2圧縮アーカイブを作成する場合は、最初にファイルを一緒にtarする必要があります。

    この設計は、それぞれが1つの仕事をし、それをうまく行うツールを作るというUnix哲学の一部です。 Tarはファイルを結合します。 Bzip2はファイルを圧縮します。このモジュラー設計の利点の1つは、両方に同時に設計されている Zip のような他の一般的な圧縮ツールと比較して、各部品が他の部品に影響を与えることなく簡単に交換できることです。たとえば、bzip2は(いくつかの点で)g​​zipの改善されたドロップイン置換であり、これは古い compress プログラムのドロップイン置換です。それらすべて、および現在または将来存在する他のさらに優れたファイル圧縮プログラム( xz など)を使用して、同じtarアーカイブを圧縮できます。

Tarとxz/bzip2/gzip/compressは頻繁に一緒に使用されるため、多くの一般的なtar実装(Linuxで通常使用されるGNU tarを含む)は、圧縮アーカイブを操作するためのいくつかの追加の便利な機能を提供します。特に、これらの圧縮プログラムの1つを使用してパックされた出力を自動的に圧縮するように(コマンドラインスイッチを介して)指示でき、このように圧縮されたアーカイブを検出して、解凍する前に自動的に解凍できる場合があります。機能はユーザーの便宜のためだけに存在します。tarの入力/出力をbzip2または他のファイルコンプレッサーにパイプするだけで、まったく同じ結果を得ることができます。


ただし、doは、tarまたはbzip2のいずれかを単独で使用し、もう一方は使用したくない場合があります。特に、圧縮したい大きなファイルが1つしかない場合は、最初にタールを塗るという余分なオーバーヘッドは必要ありません。bzip2を元のファイルに直接適用する方が効率的です。これはあなたが持っているように見えるものです:単一の大きなbzip2圧縮ファイル。

このファイルをtarにフィードしようとすると、最初にbzip2で圧縮されていることが正しく検出され、さらに処理する前に解凍が試みられます。ただし、明示的にtarを呼び出しているため、実際には(圧縮されている可能性のある)tarアーカイブを受信することを想定しており、入力を解凍した後に期待するものが見つからない場合は、表示されたエラーメッセージが表示されます。

代わりに、Michael D. すでに述べています コメントで、bzip2を使用してこのファイルを直接解凍できます。

bzip2 -d doxygen-1.8.8-linux.bz2

または(同等に):

bunzip2 doxygen-1.8.8-linux.bz2

デフォルトでは、b(un)Zip2がこのように呼び出されると、解凍されたファイルの名前は元のファイルと同じになりますが、拡張子は.bz2になります。解凍が成功すると、元の圧縮ファイルは自動的に削除されます。 (それを望まない場合は、-kまたは--keepオプションをb(un)Zip2.)に渡します。もちろん、非圧縮ファイルを再圧縮することもできます。と:

bzip2 doxygen-1.8.8-linux

または、次のように、stdinを介してb(un)Zip2にデータを渡し、対応する(非)圧縮データをstdout経由で受信することもできます。

bunzip2 < doxygen-1.8.8-linux.bz2 > doxygen-1.8.8-linux-or-whatever

これは、入力ファイルを自動的に削除しない(そして削除できない)ことと、出力ファイルに任意の名前を付けることができることを除いて、上記の以前のbunzip2コマンドと同じことを行います。

さらに便利なことに、b(un)Zip2の入力および/または出力を別のプログラムとの間でパイプすることもできます。たとえば、最初に圧縮ファイルを wget でディスクにダウンロードしてから解凍する代わりに、wgetの出力を直接bunzip2にパイプすることができます。

wget --output-document=- \
  https://wxpython.org/Phoenix/tools/doxygen-1.8.8-linux.bz2 \
  | bunzip2 > doxygen-1.8.8-linux

--output-document=-スイッチ(-O -と省略可能)は、ダウンロードしたデータをディスクに保存する代わりにstdoutに書き込むようにwgetに指示します。最後の行は、wgetの出力をbunzip2にパイプし、bunzip2の出力をファイルdoxygen-1.8.8-linuxに転送します。バックスラッシュは、読みやすくするためにコマンドを複数行に分割した場所を示しています。シェルはそれらとそれに続く改行を無視します。

1
Ilmari Karonen