web-dev-qa-db-ja.com

TARとCPIOのアーカイブファイル形式の違いは何ですか?

私は好奇心が強く、少し読んでいましたが、それでも質問があります。

CPIOとTARの違いは何ですか?別の質問で、tarは多くのファイルを1つのアーカイブにまとめて、通常はgzipまたはbzipで圧縮するためのものであると言われました。

また、TARはSTDOUTから圧縮できないと言われました。バックアップ用にZFSスナップショットをアーカイブ/圧縮したい。 CPIOをbzip2と組み合わせてこの効果を得ることができるかどうか疑問に思っていました。

または、私は完全に間違った考えを持っていますか?それはCPIOの目的ではありませんか?

これは私が読んだ後に出てきたコマンドの種類なので、ZFSスナップショットのバックアップに関するOracleのドキュメントです。

# Backup snapshot to cpio and bzip2 archive
zfs send media/mypictures@20070607 | cpio -o | bzip2 -9c > ~/backups/20070607.bz2

# Restore snapshot from cpio and bzip2 archive
zfs recieve media/mypictures@20070607 | cpio -i | bunzip2 -c ~/backups/20070607.bz2
42
ianc1215

tarcpioの両方に単一の目的があります。多くの個別のファイルを単一のストリームに連結します。データを圧縮しません。 (最近のtarは比較的単純であるため、より人気があります。findのようにcpioと組み合わせる必要がなく、入力ファイルを引数として取ることができます。)

あなたの場合、あなたは必要ありませんこれらのツールのどちらか;あなたが多くの別々のファイルを持っていないので、それらは有益な効果を持ちません。 zfs sendはすでにtarが行うのと同じことを行いました。したがって、anyファイル、名前のないストリームのみ。

スナップショットを圧縮するには、zfs出力を圧縮プログラムにパイプするだけです。

zfs send media/mypictures@20070607 | gzip -c > ~/backups/20070607.gz

gzip -dc ~/backups/20070607.gz | zfs receive media/mypictures@20070607

(必要に応じて、gzipxzまたはbzip2またはその他のストリーム圧縮ツールに置き換えることができます。)

28
user1686

grawityおよびPaulによる以前の発言に加えて、

履歴

「昔」では、cpio(オプション-cを使用)はtheだったので、ファイルを他のUNIX派生に移動するときに使用されていました。 tarよりも移植性と柔軟性に優れています。しかし、tar移植性の問題は、1980年代後半から解決されたと見なすことができます。

残念なことに、さまざまなベンダーが-c形式のcpioを変更したのはその頃でした(GNU cpioのマニュアルページとオプション-H)。当時tarcpioよりも移植性が高くなりました... ...さまざまなUNIXベンダーがそれを整理するまで、ほぼ10年かかりました。 GNU tarおよびGNU cpioをインストールすることは、当時(現在でも私が推測しているように)さまざまなソースからのテープを処理する必要のあるすべての管理者にとって必須でした。

ユーザーインターフェイス

tarは、管理者がシステムに接続されたテープドライブを構成するテープ構成ファイルを使用できます。ユーザーは、テープの正確なデバイスノードを覚える必要はなく、 "Well I 'take take tape drive 1"と言うだけです(これは非常に混乱する可能性があり、異なるUNIXプラットフォーム間で標準化されていません。

ただし、主な違いは次のとおりです。

tarは単独でディレクトリを検索でき、バックアップするファイルまたはディレクトリのリストをコマンドライン引数から取得します。

cpio指示されたファイルまたはディレクトリのみをアーカイブしますが、サブディレクトリ自体を再帰的に検索しません。また、cpioはアーカイブするアイテムのリストをstdinから取得します。これが、ほとんど常にfindと組み合わせて使用​​される理由です。

cpioコマンドはtarと比較すると、初心者にとって恐ろしいように見えることがよくあります。

 $ find myfiles -depth -print0 | cpio -ovc0 | gzip -7 > myfiles.cpio.gz
 $ tar czvf myfiles.tar.gz myfiles

ほとんどの人がアーカイブファイルを作成するためにtarを使用する主な理由はそれだと思います。完全なディレクトリをバンドルするなどの単純なタスクの場合は、使用するのが簡単です。

また、GNU tarは、オプション-zを提供します。これにより、アーカイブがGNU Zipで即座に圧縮され、さらに簡単になります。

一方、findcpioを使用すると、気の利いたことができます。実際、これはよりUNIX風のアプローチです。ディレクトリツリー検索をcpioに含める理由は、考えられるほとんどすべてのことを処理するツールが既にある場合findです。頭に浮かぶのは、特定の日付より新しいファイルのみをバックアップすること、ファイルを同じファイルシステムに存在するファイルに制限すること、または特定のファイルを除外するためにgrep -vで検索出力をフィルタリングすることです...

GNU tarの人々は、以前はcpioでのみ可能であった多くのことを含めるために多くの作業を費やしました。実際、両方のツールは相互に学習しましたが、cpioだけがtarの形式を読み取ることができます-逆はできません。

tarおよび出力処理

あなたが言ったことへの最後のメモ:

また、TARはSTDOUTから圧縮できないと言われました。バックアップ用にZFSスナップショットをアーカイブ/圧縮したい。 CPIOをbzip2と組み合わせてこの効果を得ることができるかどうか疑問に思っていました。

まあ、すべてのバージョンのtar(GNUかどうか)をパイプで使用できます。マイナス記号(-)をアーカイブ名として使用するだけです。

 $ tar cvf - myfiles | bzip > myfiles.tar.bz

またGNU tarは、ポストプロセッサコマンドを指定するオプション--to-commandを提供しますが、私はまだパイプを好みます。たぶん、特定のハードウェアデバイスに書き込むときに役立ちます。

63
ktf

tarとcpioは基本的に同じ機能を持っています。つまり、複数のファイルとディレクトリの入力から単一の連続したファイルを作成します。もともとこれは結果をテープに書き込むことでしたが、最近では一般的に、上記のように圧縮ユーティリティにフィードするために使用されます。これは、1つの大きなファイルを圧縮する方が、多数の小さなファイルを圧縮するよりも時間とスペースの効率が高いためです。多くの画像形式(png、jpgなど)はすでに高度に圧縮されており、圧縮ユーティリティを使用すると実際には少し大きくなる可能性があることに注意してください。

Tarもcpioも、それ自体は圧縮を行いません。 Tarは「集約ファイルを作成するために何を使用するか」という戦争を効果的に「勝ち取り」ましたが、cpioはさまざまな場所で調査されます。私はどちらが他のものよりも優れていることに気づいていませんが、タールはより一般的に使用されることで勝っています。

tarは確かにstdinに入力を取り、stdoutに出力することができます-次に、あなたが持っているようにbzip2にパイプされます。 「z」オプションを指定して呼び出すと、出力でgzipが自動的に呼び出されます。

6
Paul

HPテクニカルサポートにca. 1996 cpioではなくtarを使用する理由.

テープが伸びてすり減ると言われました。 tarがテープの読み取り不可能な部分に到達すると、失敗し、エラー番号が返されます。 cpioが読み取り不可能な部分に達すると、次の読み取り可能なブロックに進み、再同期して続行します。

これをサポートするドキュメントを見たことはありませんが、常にcpioを使用しました。

5
Lynn

また、注目に値する:(少なくとも)FreeBSDとMac OS Xでは、tarを使用してcpioファイルを操作できます。 BSD tarは内部でlibarchiveを使用するため、cpio、pax、sharを処理できます...

これは、cpioコマンドの使いやすさの問題が、cpioファイルとの対話を停止する必要がないことを意味します。

4
trombonehero

ここでの答えはすでにcpiotarを非常によく比較していますが、パイプラインモードと呼ばれるcpioの機能の1つを強調したいと思います。 、findおよびfilterを介して)ディレクトリ構造を保持します。この機能は 十分に文書化されています であり、基本的な前提では次のようになります。

find . <predicates> | cpio -pdmv /destination/dir

tarと同等のものには、次のようなものが含まれます。

find . <predicates> | tar -T - -cf - | (cd /destination/dir; tar xvf -)

もちろんrsynccp --parentsなどの他の代替案は another thread で説明されていますが、findの組み合わせによって提供される柔軟性に近いものはありませんおよびcpiotarがアーカイブを作成するための至る所にあるので、これが私がcpioをまだ使用している唯一の理由です。

3
haridsv