如何同时将 tar.gz 文件提取到两个目的地?

如何同时将 tar.gz 文件提取到两个目的地?

我有一些tar.gz文件。我需要将这些tar.gz文件解压到两个 USB 硬盘上。使用该命令我一次tar -xvzf只能将其提取到一个硬盘。tar.gz

如果我能建议我如何tar.gz同时将文件提取到两个硬盘,我将不胜感激。由于我需要迁移的文件总大小约为 4.5TB,这可以帮助我节省大量时间。

答案1

使用,当您多次重定向文件描述符时,zsh使用进程替换及其类似行为:tee

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

对于其他支持进程替换的 shell(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 -)

请注意,文件将以最慢的目标驱动器的速度提取。

另一种方法可能是并行运行两个驱动器的提取(此处使用 POSIXsh语法):

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 资源
  • 如果一个目标驱动器比另一个目标驱动器慢得多,则某些tar.gz文件最终可能会从源磁盘读取两次,因为它最终可能会从缓存中逐出,这会导致计算机上出现更多 I/O。

答案2

您可以使用zcat将其提取到stdout,然后tee分叉到两个不同的文件,然后是tar它们。

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

它将把您的大文件提取到“第一”和“第二”路径。

也可以这样做gunzip -c

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

相关内容