$ (cd ~/stuff; tar --create --gzip --file - *) |
ssh destination tar --extract --gunzip --file --verbose -C stuff
该命令进行了很多操作,所以让我们对其进行分解:
命令中带圆括号的部分称为subshell。subshell 中进行的更改,例如更改目录,不会影响到您的命令行,但是它将影响 subshell 的执行环境。因此,第一个短语 (cd ~/stuff; tar --create --gzip --file - *) 更改到目录 ~/stuff,然后运行 tar。因为 subshell 后面跟着管道,所以 subshell 的所有输出都通过管道传输给了下一个命令。
与许多其他的 Unix 实用程序一样,tar 可以分别向标准输出 (stdout) 写入、从标准输入 (stdin) 读取。stdout 和 stdin 通常表示为连字符 (-)。所以,短语 --create --file - 在 stdout 上创建存档。
管道 (|) 将 subshell 的所有输出通过管道传输给 ssh。这样可以有效地将所有的输出从源计算机传输到目标计算机。
最后,目标计算机运行自己的 tar 实例对存档进行解压。然而,这里的 --extract --file - 从标准输入 读取存档。-C 选项强迫接收方 的 tar 在开始进行任何处理之前,将目录更改到 stuff(在远程 home 目录中)。最后的结果是,将通过 ssh 传输的存档解压到 ~/stuff 中。
通过这一个(有些冗长的)命令,您创建了、传输并解压缩了存档。顺便提一下,对该命令行中内容的顺序稍作颠倒,您就可以从远程计算机中获取创建的存档并解压到本地计算机。下面的命令可以实现这项任务,在本地计算机中运行:
$ ssh destination cat archive.tgz |
(cd ~/stuff; tar --extract --gunzip --file -)
在远程计算机上打开远程存档,将 cat 产生的字节流发送到 subshell,这个 subshell 首先更改目录,然后对存档进行解压缩。(为 tar 命令添加 -C ~/stuff 可以起到与前面相同的作用;这个示例显示了 subshell 也可以使用输入。)
标签: