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


24

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

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

同様に、cpio -t < file.cpio完了するまでに数秒かかります。

したがって、(tar -xf file.tar myFileOfInterest.bz2たとえば)経由でアーカイブからファイルを取得するのは同じくらい遅いです。

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

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

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

回答:


15

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

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

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

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


抽出を標準出力にパイプする方法はありますか?標準入力からアーカイブを作成する方法があるように見えますが、標準出力に抽出する方法(少なくとも直接ではない)はありません。これを行う方法があるかどうかは、ドキュメントから明らかではありません。これがどのように達成されるか知っていますか?
アレックスレイノルズ

1
いや、わからない。私は実際に自分でdarを使用していません...私はそれが存在することを知っています。私はtarに十分満足しており、後で検索したい大きなtarファイルの内容をリストしたテキストファイルを作成する傾向があります。あなたは二回vオプションを使用してtarアーカイブを作成すると同時に(例えば、「タールcvvjf /tmp/foo.tar.bz2 /パス/に/バックアップ> /tmp/foo.txt」)でこれを行うことができます
CAS

10

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

  • ヒューズドライバを使用してアクセスするように設計されています(ただし、従来のインターフェイスが存在します)
  • 圧縮(ブロックサイズが大きいほど効率的)
  • Linuxカーネルに含まれる
  • UID / GIDと作成時間を保存します
  • エンディアネスに対応しているため、非常にポータブル

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

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


8

インデックスを保存しませんが、starはを超えると言われていますtar。さらに、長いファイル名をサポートし、ファイル属性のサポートが向上しています。

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

編集:をご覧になることもできますxar。アーカイブ内のファイルに関する情報を含むXMLヘッダーがあります。

参照ページから:

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


これまでに聞いたことのない便利なサウンドツールを通知してくれた+1
cas

リンクstarがダウンしています...
Pacerier

5

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

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


tar manページman7.org/linux/man-pages/man1/tar.1.htmlによると、GNU tarはデフォルトで書き込み時にシーク可能なフォーマットを使用し、アーカイブがシーク可能な場合、読み取り時にそれを使用します(リストまたは抽出)。GNU tarを使用していても問題が解決しない場合は、GNUでバグレポートを提出する必要があります。
ブライアンミントン14

7
私がマニュアルを正しく読んだ場合、それはどんな種類のインデックスも持っているとは決して言わず、ファイル名を与えられたアーカイブ内の任意のファイルにジャンプできます。--seekは、基礎となるメディアがシーク可能であることを意味するため、最初から読み取る場合、ファイルの内容の読み取りをスキップできますが、エントリヘッダーを最初から読み取る必要があります。つまり、1Mファイルのアーカイブがあり、最後のアーカイブを--no-seekで抽出しようとすると、すべてのファイルの内容を読み取る必要があります。--seekを使用すると、ファイルごとに1Mのヘッダーを読み込むだけで済みますが、それでも非常に遅いです。
icando

4

私が知っている唯一のアーカイブ形式は、破損したインデックスを何度も再構築する必要があるため、インデックスを保存するZIPです。


2

私が知っているインデックスはありませんが、大きなファイルでダンプ&リストアを使用し、インタラクティブモードでリストアツリーをナビゲートしてランダムファイルを選択するのは非常に高速です。


2

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

それとも、とアーカイブのインデックスを一覧表示することができます7z lして検索するのに便利ですgrep

$ 7z l myarchive.7z | grep

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

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

重要な注意 Linuxファイルシステムのバックアップには7zip形式を使用
ないでください。7zip形式は含まれるファイルの所有者とグループを保存しません。


Linuxの場合、tarファイルを7zipすることで問題ありません。
トールビョーンラヴンアンデルセン

1

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

いずれにせよ、インデックス付きのアーカイブ形式が必要です(必要なことを行えるようになるため)。残念ながら、ZIPファイルがそれほど大きくなることはないと思います。


ZIPファイルには、成長することができ、大きな
Pacerier

1
私がマニュアルを正しく読んだ場合、それはどんな種類のインデックスも持っているとは決して言わず、ファイル名を与えられたアーカイブ内の任意のファイルにジャンプできます。--seekは、基礎となるメディアがシーク可能であることを意味するため、最初から読み取る場合、ファイルの内容の読み取りをスキップできますが、エントリヘッダーを最初から読み取る必要があります。つまり、1Mファイルのアーカイブがあり、最後のアーカイブを--no-seekで抽出しようとすると、すべてのファイルの内容を読み取る必要があります。--seekを使用すると、ファイルごとに1Mのヘッダーを読み込むだけで済みますが、それでも非常に遅いです。
icando

2
@Pacerier私の理解では、ZIP64形式は非常に大きなファイルを許可しますが、元のZIP形式は許可しません。
トールビョーンラヴンアンデルセン

@ThorbjørnRavnAndersen、単一の4 GBファイルは大きな男です。
Pacerier

3
DVD ISOがほぼ20年前に登場して以来、@ Pacerier 4GBはそれほど大きくありませんでした。テラバイトは最近大きくなっています。
オリゴフレン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.