幅優先検索.tar.gzファイルは可能ですか?

幅優先検索.tar.gzファイルは可能ですか?

ダウンロードしたい部分大容量(199GB).tar.gzファイル1個ここ。まず、次のコマンドを使用して .tar.gz ファイル内のすべてのファイルを一覧表示します。

wget -qO- https://www.cs.cornell.edu/projects/megadepth/dataset/Megadepth_v1/MegaDepth_v1.tar.gz | tar -tz

次に、次のコマンドを使用して.tar.gzフォルダの内容をダウンロードしてみました。

wget -qO- https://www.cs.cornell.edu/projects/megadepth/dataset/Megadepth_v1/MegaDepth_v1.tar.gz | tar -xz phoenix/S6/zl548/MegaDepth_v1/0000

tarただし、コマンドは深度優先および再帰的に下の各フォルダを検索するため、時間がかかりすぎますphoenix/S6/zl548/MegaDepth_v1。私はフォルダの内容だけに興味がありますphoenix/S6/zl548/MegaDepth_v1/0000。他のフォルダのサブフォルダを検索せずにこのフォルダのコンテンツをダウンロードする方法はありますか?

phoenix/S6/zl548/MegaDepth_v1/0162
phoenix/S6/zl548/MegaDepth_v1/0001
phoenix/S6/zl548/MegaDepth_v1/0132

つまり、フォルダの内容をすばやくダウンロードする方法はありますかphoenix/S6/zl548/MegaDepth_v1/0000


上記のコマンドに関するいくつかの参考資料:

tar.gzから特定のファイルを抽出する方法

アーカイブをディスクに保存せずにアーカイブをダウンロードして解凍する方法は?

https://stackoverflow.com/q/2700306/13809128

答え1

tarファイルヘッダー、ファイル内容、次のファイルヘッダー、次のファイル内容などを作成します。

項目には関連する順序がなく、考えられる唯一の最適化は、ファイルの内容をスキップして次のヘッダーを直接見つけることです。これを行うには、検索できるファイルが必要です。

ただし、コンテンツが.gz圧縮されているため、次の項目に移動するための確実な方法はありません。〜しなければならないファイル全体を読み(ダウンロード)内容を取得します。答えは次のとおりです。いいえ、ファイル全体を読み取ったりダウンロードしたりすることは避けられません。

したがって、とにかく完全にダウンロードする必要があるため、一度ダウンロードしてローカルファイルシステムの問題を解決することをお勧めします。

答え2

tarコマンドは深度優先および再帰的に検索するため...

実はそうではありません。しかし、実際にはそうではありません。探す 別の言葉、代わりにアーカイブを読んで、出会うすべてのファイルを見て、あなたが望むものと一致することを確認してください。 (ディレクトリツリーを巡回する自然な順序であり、ファイルがアーカイブに追加される順序であるため、深度優先動作を取得します。)

これは、tarアーカイブが索引付けされていないため検索できないためです。 「tar」という名前は「テープアーカイブ」を意味し、テープ操作の一般的なモードは、ナビゲーションなしで単一ストリームを読み書きすることです。この形式はこれらの文脈に合わせて設計されており、ユースケースに最も適していない可能性があります。

良い参考資料が見つかりませんが、一部 回答ウェブサイトとウィキペディア

答え3

を実行するたびに、wgettarファイル全体をダウンロードしようとしています! 「初期コンテンツ」を何度もダウンロードし、出力をstdoutに送信して破棄した可能性があります!

代わりに、「より速い」方法は、現在のディレクトリの./MegaDepth_v1.tar.gzに一度ダウンロードして解凍することです。

wget -q -O MegaDepth_v1.tar.gz  https://www.cs.cornell.edu/projects/megadepth/dataset/Megadepth_v1/MegaDepth_v1.tar.gz  
tar -xz -f MegaDepth_v1.tar.gz phoenix/S6/zl548/MegaDepth_v1/0000  

必要なファイルがあれば、ダウンロードしたtarファイルを削除できます。

更新:元のファイルサイズは約200 GBのようです。ダウンロード自体は多くの時間とスペースを占めています。抽出にはさらに時間がかかります。、この場合は!
MegaDepth チームに連絡して別のディレクトリへのアクセスをリクエストする必要がある場合があります。そうしないと、常に速度が遅くなります。

ここではwget望ましくないコンテンツをスキップする方法がなく、tarファイル全体が常に最初から最後までダウンロードされます。また、ilkkachユーザーの回答で述べたように、tarstdoutストリームをスキップまたは検索する方法はありません。

答え4

分析する

tar圧縮されたアーカイブを見つける方法がないという他の答えに同意します。探しているファイルを見つけるには、ツールは何もスキップせずに最初からアーカイブを処理する必要があります。

しかし、GNUを使用すれば、tar必ずしも最後まで進む必要はありません。アーカイブを作成するときは、次のシナリオを考慮してください。

ファイルを変更bluesし、変更したバージョンをcollection.tar.[...]に追加し、ソースがbluesアーカイブにあるとしますcollection.tar。ファイルを変更してそのファイルの新しいバージョンをアーカイブに追加すると、アーカイブに2つのコピーがあります。アーカイブを抽出すると、ファイルの古いバージョンが最初に抽出され、次に抽出中に新しいバージョンに置き換えられます。

源泉)

これは、特定のファイルを抽出すると、tar後でアーカイブに別のコピーがある可能性があるため、ファイルを抽出した後でもアーカイブが処理を続けることを意味します。

しかし:

bluesアーカイブからファイルの最初のエントリを抽出するには、--occurrence次のオプションを使用します。

(同じ上記と)

探しているファイルがアーカイブに一度しか表示されない場合は、ファイルを抽出して使用を中止してくださいtar --occurrencetarこれはあなたのwget仕事を中断し、SIGPIPEファイルの残りの部分を無駄にダウンロードしません。


限られた使用

ノートこれはあなたにとってあまり役に立ちません精密phoenix/S6/zl548/MegaDepth_v1/0000ディレクトリだからです(そうですか?)。を使用すると、そのディレクトリの他のエントリが見つからない限り、ディレクトリの抽出は早期--occurrencetar停止されません。それ自体。その理由は、phoenix/S6/zl548/MegaDepth_v1/0000/fooファイルの末尾に常に一意のエントリがあるためです。ディレクトリとその内容が最後まで完了したことを確認する方法はありませんtar

しかし、一つまたは複数が欲しい場合ディレクトリではないを使用すると、パスを知っていて、アーカイブに各パスのインスタンスが1つしかないことがわかっている場合は、必要に応じて少ない数の--occurrenceアーカイブをダウンロードできます。幸運なので、ファイルがアーカイブの先頭に近い場合、顕著な--occurrence違いが発生します。

おそらく、この答えはあまり役に立ちません。次のリストを提供できるユーザーの場合ディレクトリではない


しない限り…

出力を保存した場合wget -qO- … | tar -tz(アーカイブ全体をダウンロードして処理して廃棄する可能性が最も高い)、次のリストを提供できるようになりました。ディレクトリではない--files-from=(またはを使用することもできます--verbatim-files-from。リストが単一のコマンドラインに比べて長すぎる場合は特に便利です)。この場合は--occurrence役に立ちます。また、保存された出力を使用して、探してtar -tいるディレクトリ以外の各エントリがアーカイブに一度だけ表示されることを確認できるため、--occurrence最新バージョンを見逃すことはありません。

上記の仮定はMegaDepth_v1.tar.gzサーバー上で変更されていません。通常、(アーカイブが変更された場合)、保存された出力はtar -t無効になる可能性があります。

抽出するディレクトリではなくリストを作成できるとします。リストは必ずいいえディレクトリを明示的に指定しないと--occurrence役に立ちません。tar必要なディレクトリはまだ作成されますが、実際にはアーカイブからディレクトリを抽出するためではなく、ディレクトリではなくディレクトリをディレクトリに配置するためのものです。つまり、ディレクトリ自体のアーカイブメンバーは重要ではありません。これは、ディレクトリが作成されますが、同様のオプションが--preserve-permissionsそのディレクトリに適用されないことを意味します。


概念の証拠

最初のコマンド(tar -t)を使用しましたが、phoenix/S6/zl548/MegaDepth_v1/0162/dense0/depths/16384199365_2b34b42cf4_b.h5アーカイブの先頭に近いディレクトリがないことがわかりました。パイプライン:

wget -qO- https://www.cs.cornell.edu/projects/megadepth/dataset/Megadepth_v1/MegaDepth_v1.tar.gz \
| tar -xvz phoenix/S6/zl548/MegaDepth_v1/0162/dense0/depths/16384199365_2b34b42cf4_b.h5

ファイルを抽出して続行します(Ctrl+できますc)。

wget -qO- https://www.cs.cornell.edu/projects/megadepth/dataset/Megadepth_v1/MegaDepth_v1.tar.gz \
| tar --occurrence -xvz phoenix/S6/zl548/MegaDepth_v1/0162/dense0/depths/16384199365_2b34b42cf4_b.h5

ファイルを抽出して自動的に終了します。

関連情報