それぞれのサイズが約10 GBの約20個のファイルが異なるフォルダにあり、tarで圧縮する必要があります。すべてのアイテムを1つの場所にコピーするのは非現実的です。より正確には、これらのファイルは次のように構成されています。
index1_index2/サブフォルダ/bigfile.dat
ここで、index1とindex2はそれぞれ異なる値を持ちます。
bashなどを使用しているように、これらすべてのファイルを含む単一のタルボールを取得する実用的な方法は何ですか?
答え1
同じファイルシステムにある場合は、共通ディレクトリとtarにハードリンクできます。それ目次。
あるいは、GNU tarを使用している場合は(より柔軟に)パブリックディレクトリにソフトリンクし、-h
tarのオプションを使用して指すファイルをソフトリンクすることもできます。
マニュアルページ後者は示しています:
-h
、--dereference
シンボリックリンクをたどり、そのリンクが指すファイルをダンプします。
FreeBSD タール同等のオプションはサポートされていますが、名前が付けられますpax
(下記参照)。
もちろん、比較するPOSIX tarはありません。使えるならpax
、同様の-L
オプションがあります。
-L
ディレクトリタイプのファイルを参照するシンボリックリンクがコマンドラインで指定されている場合、またはファイル階層を参照している間にシンボリックリンクが見つかった場合は、リンクが参照するファイルをルートとするファイル階層をpax
次のリンク名でアーカイブする必要があります。ルートファイル階層。それ以外の場合は、通常pax
アーカイブされている他のファイル形式のファイルを参照するシンボリックリンクがコマンドラインで指定されている場合、またはファイル階層の参照中に見つかった場合は、リンクによって参照さpax
れるファイルはリンク名を使用してアーカイブする必要があります。どちらもない場合の基本動作-H
または-L
指定した場合は、シンボリックリンク自体をアーカイブする必要があります。
ハードリンクでもソフトリンクでも、既存のファイルを移動する必要はありません。ハードリンク多様性(タイムスタンプctime
)ファイルですが、ソフトリンクではありません。ただし、同じオプションを使用するtarの実装では、ソフトリンクは普遍的にはサポートされていません(同じファイルシステムに存在する必要性は少なくなります)。
OPの元のステートメントは、すべてのファイルを1つのディレクトリに置くのが不便な理由は、ファイルを生成するアプリケーションのいくつかの制限によるものであることを示しているようです。明確にした後、問題はすべて同じファイル名を持っていることが明らかになりました。ディレクトリに接続するとき(たとえば、元のディレクトリエンコード)ディレクトリ名共通の場所として)は確かに可能ですが、ファイルを単一のアーカイブとして収集し、既存のディレクトリ名を保持する他のオプションがあります。この方法の1つの欠点は、すべての場所に復元する機能が制限されることです。しかし、tarに約20の名前を渡す最も簡単な方法は、コマンドラインを使用することです。
`tar czf myoutput.tar.gz $(find . -type f -name bigfile.dat)`
ファイルは20個しかないので、コマンドラインの長さの問題ではない可能性が高いです。tar
実装では、別のコマンドライン引数ではなくパス名のリストを渡す機能が不足していることが多いため、ファイル数が多い場合やパス名が非常に長い場合、操作がより困難になります(参照)。ソラリス例えば)。この場合、アーカイブを徐々に作成してこの制限を解決しようとすることができますが、圧縮では機能しません。一部の実装では、ファイルからファイル名のリストを読み取るオプションを提供します。これGNU タール-T
(FreeBSD)オプションもこれを行うことができます。他のプログラムでは、標準入力からファイル名のリストを読み取るための3番目のオプションを提供できます(例:公園、これは以下の影響を受けました。CPIO)、しかし通常tarはそうではありません。ファイルを読み取ることができます。コンテンツ標準入力から。
答え2
最も直接的な方法は次のとおりです。
tar cfz bigtar.tar.gz /path/to/file1 /path/to/file2 ... /path/to/file20
ターゲットファイル間に一致する類似性がある場合は、GNUの()を使用してfind
ファイルリストを作成できます。tar
-T
--files-from
たとえば、両方とも.mp4ファイルの場合:
find /path -type -f -iname '*.mp4' | tar cf bigtar.tar -T -
それ以外のファイル名を選択する簡単なパターンがない場合は、findを使用してtmpfileに初期リストを作成し、そのリストを手動で編集してtarに含めたくないファイル名を削除してから、そのファイルの名前を使用できます。 tmpfileをtar Optionsで編集しました-T
。