tarファイルをアルファベット順に作成するにはどうすればよいですか?


22

すべてのディレクトリとファイルがアルファベット順に処理されるtarファイルを作成したい。これは、タール化されているディレクトリ階層全体に対するものであるため、最初のディレクトリをアルファベット順に処理し、次にその中のサブディレクトリをアルファベット順に処理することから開始します。

私は認めます、これは半分の目新しさ、半分の最適化です。これを行う簡単な方法がないとは信じられません。私は何かが欠けているに違いない。


2
なぜこれをしたいのですか?
マティアスクル

たいていは、tar操作がどの程度完了しているかを知りたいからです。ファイルがランダムな順序でロードされている場合、-vフラグで通知する方法はありません。
エリックロバートソン

2
それは完全に真実ではありません。出力をファイルにパイプしてファイルの数を知っている場合(クイック検索コマンドなど)、-v出力(wc -l)をfindからのファイルの数と比較して、進行状況を把握できます...
Slartibartfast

2
@matthiaskrullこれには無関係の理由があります。VMWareESX ServerにVMを展開するためのOVAファイル(tarファイル)を作成しています。OVAは、内部に特定の順序でファイルを必要とします(最初のファイルはOVFなどである必要があります)。
xask 14

1
これには非常に良い理由もあります。非常に大きなファイルの一部のみを抽出したい場合のパフォーマンスです。その順序はデフォルトでランダムであり、ファイル/ディレクトリを抽出したいので、順序付けられた場合は高速になり、そうでない場合は、アーカイブが終了したことを知る前にアーカイブ全体をスキャンする必要があります。
StormByte

回答:


12

Slartibartfastは正しい軌道に乗っていますが、tarのデフォルトの動作はディレクトリに降りることです。そのため、生成されたtarファイルに含まれる同じファイルの複数のコピーを取得できます。あなたは実行して確認することができます tar tf file.tar | sort 回避策はタールに--no-再帰オプションを含めることです。また、 -print0 オプションを使用して検索してからオプションを使用して、奇妙なファイル名で送信できるようにする必要があります--null。最終結果は次のようになります。

find paths -print0 | sort -z | tar cf tarfile.tar --no-recursion --null -T -

を使用して、tarファイルの順序を確認できますtar tsf tarfile.tar。改行が埋め込まれたファイル名に遭遇することがわかっていない限り、おそらく-print0、-z、および--nullオプションは必要ないでしょうが、私は試したことはありません。


--no-recursionオプションを使用するための優れた提案、ありがとう。
エリック

これは私のために働いた解決策です。Erickとは異なるユースケースがあり、Googleがここに連れてきてくれました。リモートシステムの完全な状態の経時的なスナップショットを収集しています。データは非常に冗長です。tar入力を時間でソートすると(ファイル名にはタイムスタンプが付けられます)、コンプレッサーのパフォーマンスが向上します。簡単なテストでは、係数2(lzma2)による改善が示されています。また、アーカイブをファイルシステムに解凍するのではなく、tarエントリに対してストリーム処理を行います。ソートされたストリームは、デバッグ出力を大幅に改善し、プロセスチェーンに他の利点をもたらします。+1
ヨハネス14

5

ファイルが抽出されるとき、ファイルシステムはいずれにしても順序を保持しないため、tarファイル内のファイルの順序は実際には重要ではありません。

これにはスイッチはありませんが、本当に必要な場合は、ソートされた順序でファイル名のリストをtarに提供できます。これにより、指定した順序でtarファイルが作成されます。

% tar cf tarfile tmp/diff.txt src/hellow.c junkimage.IMG barry/thegroup
% tar tf tarfile
tmp/diff.txt
src/hellow.c
junkimage.IMG
barry/thegroup

2
あるいは単にソート出力:tar tf tarfile | sort
ダグ・ハリス

コマンドラインですべてを指定するには、ファイル数が多すぎます(20,000以上)。
エリックロバートソン

4
ダウンロード中に解凍して表示する必要がある場合、tarファイル内のファイルの順序は重要です。
エリック

ファイルシステムに依存します。
トールビョールンラヴンアンデルセン

4

名前に改行を含むファイルがないと仮定します。

find /source_directory -print | sort | tar -czf target.tgz -T -

それがうまくいかない場合(試したことがないので、私は知りません--T引数の標準入力を意味します):

find /source_directory -print | sort > /tmp/temporary_file_list
tar -czf target.tgz -T /tmp/temporary_file_list

次に、なぜかという疑問があります。しかし、時々、尋ねない方が簡単です。


2
find . -depth -print0 | sort -z | pax -wvd0 > file.tar

PaxはcpioとtarのPOSIXの後継の一種であり、両方の長所を融合しています。デフォルトでtarアーカイブ(ustar)を書き込みます。また、メディアの自動スパンニングとプロンプト表示を行い、完了時に要約を出力します。


0

@CharlieHerronの答えに代わるものとして、コンテンツ(ファイル、シンボリックリンク)とフォルダーメタデータ(たとえば、フォルダーのアクセス許可、mtimeなど)のみを保持することに関心がある場合、findの出力からフォルダーをフィルターすることができます。

find paths -not -type d -print 0 | sort -z | tar cf tarfile.tar --null -T -
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.