web-dev-qa-db-ja.com

tar.gzファイルを2つの宛先に同時に抽出する方法は?

tar.gzファイル。これらを抽出する必要がありますtar.gzファイルを2つのUSBハードディスクに。コマンドtar -xvzf抽出できるのはtar.gz一度に1つのハードディスクに。

tar.gzファイルを2つのハードディスクに同時に保存します。移行する必要のあるファイルの合計サイズは約4.5TBであるため、これにより時間を大幅に節約できます。

5
Karl Leung

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 -)

ファイルは、最も遅い宛先ドライブの速度で抽出されることに注意してください。

別のアプローチは、両方のドライブの抽出を並行して実行することです(ここではPOSIX sh構文を使用しています)。

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

ただし、次のことに注意してください。

  • より多くのCPUリソースを使用している各ファイルを2回解凍することを意味します
  • 1つの宛先ドライブが他のドライブより大幅に遅い場合、一部のtar.gzファイルがソースディスクから2回読み取られる可能性があります。これは、ファイルがキャッシュから追い出され、マシンのI/Oが増える可能性があるためです。
3

zcatを使用してstdoutに抽出し、次にteeを使用して2つの異なるファイルに分岐し、次にtarでそれらを抽出できます。

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

ビッグファイルを「第1」および「第2」のパスに抽出します。

gunzip -cも:

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