我有一些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