tar.gzファイルを同時に2つのターゲットに抽出するには?

tar.gzファイルを同時に2つのターゲットに抽出するには?

ファイルがいくつかありますtar.gztar.gzこのファイルを2つのUSBハードドライブに解凍する必要があります。このコマンドを使用すると、tar -xvzf一度に1つのハードドライブにのみ抽出できます。tar.gz

tar.gz同時に、両方のハードドライブにファイルを抽出する方法を提案していただきありがとうございます。移行する必要があるファイルの合計サイズは約4.5 TBなので、時間を節約するのに役立ちます。

答え1

ファイルディスクリプタを複数回リダイレクトするときは、プロセス置換とzsh同様の動作と組み合わせて使用​​してください。tee

zcat file.tar.gz > >(cd /media/disk1 && tar xf -) > >(cd /media/disk2 && tar xf -)

プロセス交換をサポートするその他のシェル(ksh、bash)の場合:

{
  zcat file.tar.gz 4>&- |
    tee >({ cd /media/disk1 && tar xf -; } >&4 4>&-) |
    { cd /media/disk2 && tar xf -; } 4>&-
} 4>&1

以下を備えたシステムのPOSIXly /dev/fd/x

zcat file.tar.gz | {
  {
    tee /dev/fd/3 |
      { cd /media/disk1 && tar xf -; } 3>&-
  } 3>&1 >&4 4>&- |
    { cd /media/disk2 && tar xf -; } 4>&-
} 4>&1

複数のファイルに対して操作を実行するにはtar.gz(これはまだzsh

for f (*.tar.gz) zcat -- $f > >(cd /media/disk1 && tar xf -) > >(cd /media/disk2 && tar xf -)

ファイルは、最も遅いターゲットドライブの速度で抽出されます。

別のアプローチは、2つのドライブの抽出を並列に実行することです(shここではPOSIX構文を使用)。

for f in *.tar.gz; do zcat -- $f | (cd /media/disk1 && tar xf -); done &
for f in *.tar.gz; do zcat -- $f | (cd /media/disk2 && tar xf -); done
wait

しかし、注意してください:

  • これは、各ファイルの圧縮を2回解放して、より多くのCPUリソースを使用することを意味します。
  • あるターゲットドライブが別のドライブよりもはるかに遅い場合、一部のtar.gzファイルは最終的にキャッシュから削除され、コンピュータにさらにI / Oが発生するため、ソースディスクから2回読み取られる可能性があります。

答え2

これを使用zcatして抽出し、2つの異なるファイルにフォークしてから、両方のファイルstdoutにフォークできます。teetar

zcat bigfile.tar.gz | tee >(tar -xC /path/to/first/) | tar -xC path/to/second

大容量ファイルを「最初」と「2番目」のパスに抽出します。

次のようにすることもできますgunzip -c

gunzip -c bigfile.tar.gz | tee >(tar -xC /path/to/first/) | tar -xC path/to/second

関連情報