web-dev-qa-db-ja.com

アーカイブに保存されているファイルを効率的に取得するための、よりスマートなtarまたはcpioはありますか?

tarを使用して、非常に大きな(マルチGB)bz2ファイルのグループをアーカイブしています。

tar -tf file.tarを使用してアーカイブ内のファイルを一覧表示すると、完了までに非常に長い時間がかかります(約10〜15分)。

同様に、cpio -t < file.cpioの完了までにかかる時間は、プラスまたはマイナス数秒です。

したがって、(たとえば[tar -xf file.tar myFileOfInterest.bz2を介して)アーカイブからファイルを取得するのと同じくらい時間がかかります。

アーカイブ内の個々のファイルをすばやく取得できるように、アーカイブですぐに利用できる「カタログ」を保持するアーカイブ方法はありますか?

たとえば、アーカイブ内の特定のバイトへのポインタと、取得するファイルのサイズ(およびその他のファイルシステム固有の詳細)を格納するある種のカタログ。

アーカイブ内のファイルを効率的に取得できるツール(またはtarまたはcpioへの引数)はありますか?

24
Alex Reynolds

tar(およびcpioとafioとpaxと同様のプログラム)は、ストリーム指向の形式です。これらは、テープに直接ストリーミングするか、別のプロセスにパイプすることを目的としています。理論的には、ファイル/ストリームの最後にインデックスを追加することは可能ですが、実行できるバージョンはわかりません(ただし、これは便利な拡張機能です)

既存のtarまたはcpioアーカイブには役立ちませんが、そのようなインデックスを含むアーカイブファイルを作成し、アーカイブ内の個々のファイルにすばやく直接アクセスできる別のツールdar(「ディスクアーカイブ」)があります。 。

darがunix/linux-distに含まれていない場合は、次の場所にあります。

http://dar.linux.free.fr/

15
cas

このようなアーカイブにはSquashFSを使用できます。です

  • fuseドライバーを使用してアクセスするように設計されています(従来のインターフェースが存在します)
  • 圧縮(ブロックサイズが大きいほど効率的)
  • linuxカーネルに含まれる
  • uID/GIDと作成時刻を保存します
  • エンディアンを認識しているため、非常に移植可能

私が知っている唯一の欠点は、それが読み取り専用であることです。

http://squashfs.sourceforge.net/http://www.tldp.org/HOWTO/SquashFS-HOWTO/whatis.html

10
MauganRa

インデックスは保存されませんが、 startarよりも高速であるとされています。さらに、長いファイル名をサポートし、ファイル属性のサポートが向上しています。

ご存知のとおり、ファイルの解凍には時間がかかり、インデックスがあったとしても、抽出速度の要素になる可能性があります。

編集:xar も参照してください。アーカイブ内のファイルに関する情報を含むXMLヘッダーがあります。

参照ページから:

XarのXMLヘッダーにより、アーカイブに含まれるファイルに関する任意のメタデータを含めることができます。 xarは、ファイルのサイズ、変更時間、作成時間などの標準的なUNIXファイルメタデータに加えて、ext2fsおよびhfsファイルビット、UNIXフラグ、拡張属性への参照、Mac OS X Finder情報、Mac OSなどの情報を保存できます。 Xリソースフォーク、およびファイルデータのハッシュ。

ThorbjørnRavn Anderser は正しいです。 GNU= tarはデフォルトで「シーク可能な」アーカイブを作成します。ただし、-nオプションが指定されていない場合、これらのアーカイブを読み取るときにその情報は使用されません。-nオプションを使用すると、300GBから7GBファイルを抽出しました7GBの読み取り/書き込みに必要な時間内のアーカイブ-nなしでは1時間以上かかり、結果は生成されませんでした。

圧縮がこれにどのように影響するかはわかりません。私のアーカイブは圧縮されていません。 現在の(1.26)GNU tarは、圧縮を外部プログラムにオフロードするため、圧縮アーカイブは「シーク可能」ではありません。

5
Aidas Kasparas

破損したインデックスを2回以上再構築する必要があったため、インデックスを保存する唯一のアーカイブ形式はZipです。

4
womble

それは私が知っている索引付けではありませんが、大きなファイルでダンプと復元を使用し、ランダムファイルを選択するために対話モードで復元ツリーをナビゲートすることは非常に高速です。

2
MediaManNJ

p7Zip-fullパッケージにアクセスできる場合は、7z(7Zip)アーカイブ/圧縮形式を使用できます。

Ubuntuでは、次のコマンドを使用してインストールできます。

$ Sudo apt-get install p7Zip-full

アーカイブを作成するには、7z a <archive_name> <file_or_directory>を使用できます。ファイルを圧縮せず、そのまま「保存」したい場合は、次のように-mx0オプションを使用できます。

$ 7z a -mx0 myarchive.7z myfile.txt

Creating archive myarchive.7z

次に、7z eを使用してファイルを抽出できます。

$ 7z e myarchive.7z

Processing archive: myarchive.7z
Extracting  myfile.txt

または、grepで検索するのに便利な7z lを使用して、アーカイブのインデックスを一覧表示できます。

$ 7z l myarchive.7z | grep

2014-07-08 12:13:39 ....A            0            0  myfile.txt

これは、整合性をテストするtオプション、アーカイブにファイルを追加/更新するu、およびファイルを削除するdでもあります。

重要な注意
Do not含まれるファイルの所有者とグループを保存しないため、Linuxファイルシステムのバックアップには7Zip形式を使用します。

2
complistic

私は信じるGNU= tarはあなたが望むことを実行することができますが、そう言っている決定的なリソースを見つけることができません。

いずれの場合も、インデックス付きのアーカイブ形式が必要です(これにより、必要な操作を実行できます)。残念ながら、Zipファイルはこれほど大きくなる可能性があります。