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


41

私は興味があり、少し読んでいますが、まだ質問があります。

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

忘れないでくださいpax:P
ヤヌストロエルセン

回答:


28

両方tarcpio単一の目的を持っている:CONCATENATE多くの別々のファイルを単一のストリームに。データを圧縮しません。(これらの日は、tarその相対的な単純さに起因する、より人気がある-それは代わりに接続されるようになるの引数として入力ファイルを取ることができfindcpioいます。)

あなたの場合、これらのツールのいずれも必要ありません。多くの個別のファイルがないため、これらは有用な効果はありませんzfs sendすでに行っていたでtarあろう同じことを既にしました。したがってファイルはなく、名前のないストリームしかありません。

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

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

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

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


なるほど、ZFS出力はファイルではなくデータストリームですか?したがって、Oracleの例にコマンドにTARが含まれていない理由を説明できます。
ianc1215

1
@Solignis:あなたはそれをこのように考えることができます:zfs sendすでにそうするのと同じことtarをしています。
悲しみ

62

過去の悲しみパウロの発言に加えて:

歴史

「昔」では、cpio(オプションを-c使用)はtarより移植性と柔軟性が高いため、ファイルを他のUNIX派生製品に移動するときに使用するツールでし。しかし、タールの移植性の問題は、1980年代後半以降に解決されたと見なされる場合があります。

残念なことに、その頃にさまざまなベンダー-ccpioの形式を変更しました(GNU cpioとオプションのマニュアルページを参照してください-H)。そのとき、tarcpioよりも移植性が高くなりました...さまざまなUNIXベンダーがそれを整理するまで、ほぼ10年かかりました。持つGNUのtarGNUのcpioの異なるソースからのテープに対処しなければならなかったすべての管理者のための絶対必要で、その後インストールを戻っていた(でも、最近私は推測します)。

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

tarは、システムに接続されたテープドライブを管理者が構成するテープ構成ファイルを使用する場合があります。ユーザーは、テープの正確なデバイスノードを覚える必要はなく、「テープドライブ1を使用します」と言うだけです(非常に混乱しやすく、さまざまなUNIXプラットフォームで標準化されていません)。

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

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

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

cpioコマンドは、多くの場合と比較すると、初心者に恐ろしい見えタール

 $ 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:ほぼすべての1が考えることができるの世話をするツールすでにあるかどう発見が。思い浮かぶのは、特定の日付より新しいファイルのみをバックアップし、同じファイルシステムに存在するファイルに制限するか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ポストプロセッサコマンドを指定するオプションがありますが、私はまだパイプを好みます。特定のハードウェアデバイスに書き込むときに役立つかもしれません。


「STDOUTに」ではなく、その後異なり、..「STDOUTからは」本当に私には意味がありません「STDINから」ことそれをwouldntは
ヨアキムElofsson

まあ、私は元の質問を引用していました。アイデア-それはやや誤解されていますが、私は1つがポイントを得ると思います。
ktf

3
「考えられるほとんどすべてのことを処理するツールがすでにある場合、cpioにディレクトリツリー検索を含める理由」良い質問ですが、コピー(cp)、移動(mvdiffなども要求する必要があります;- )
メッキー

1
トロンボーンヒーローは言ったBSD tar uses libarchive under the hood, so it can handle cpio, pax, shar。あなたが言った:only cpio may read the format of tar。それは矛盾ではありませんか?
n611x007

6

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

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

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


1
ええ、-jbzip2を呼び出さないのですか?
ianc1215

2
はい、-jはBZIP2であり、いくつかの(より再送?)のバージョンがGNUTARのthatisため、XVとして-Jを得た
ヨアキムElofsson

4
GNU tarの最新バージョンでは、オプション-aを使用すると、アーカイブファイル名から目的の圧縮形式を推測することもできます。したがって、これはtar -caf myfiles.tar.xz myfiles/を使用xzして圧縮し、これtar -caf myfiles.tar.gz myfiles/はを使用して圧縮しgzipます。
-gerlos

5

私はカリフォルニア州のHP技術サポートに尋ねました。1996を使用cpioする理由tar

テープが伸びて摩耗すると言われました。ときにtarテープの読めない部分に到達したことは失敗し、エラー番号を返します。ときにcpio読めない部分に到達し、それは、次の読み取り可能なブロックに再同期を継続し続けます。

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


投稿によると、tarのビット単位の損傷は、cpioについて語ったのと同じように、影響を受ける領域/ファイルに限定されているようです。 oxfordrepo.blogspot.tw/2008/12/archive-file-resiliences.html
okwap

4

また、(少なくとも)FreeBSDおよびMac OS Xでは、cpioファイルをtarで操作できます。BSD tarは、内部でlibarchiveを使用するため、cpio、pax、sharを処理できます。

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


ktf は言ったonly cpio may read the format of tar。あなたが言った:BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar。それは矛盾ではありませんか?
n611x007

1
@ n611x007この回答では、BSD tarについて説明しています。もう1つはおそらくGNU tarについて話しているでしょう。それらは異なるプログラムです。
ナビン

3

一方で、ここでの答えは、すでに比較cpioしてtar非常によく、私はのハイライト1に希望cpio選択ファイル(つまり、経由でコピーすることがより効率的にパイプラインモードと呼ばれるの機能find、そのディレクトリ構造を維持しながら、フィルターを)。この機能はよく文書化されており、その基本的な前提は次のようになります。

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

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

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

そこのような、もちろん他の選択肢であるrsynccp --parentsして議論し、別のスレッドが、何もの組み合わせによって提供される柔軟性の近くに来ることはありませんfindcpio。でtarアーカイブを作成するためのユビキタスされ、これは私はまだ使用している唯一の理由ですcpio

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.