对于复制单个文件而言,scp 和 rsync 命令实际上是等价的。比方说,你需要把 foo.txt 传到你在名为 server 的服务器上的主目录下:
$ scp foo.txt me@server:/home/me/
相应的 rsync 命令只需要输入 rsync 取代 scp:
$ rsync foo.txt me@server:/home/me/
复制目录
对于复制目录,就有了很大的分歧,这也解释了为什么 rsync 会被认为比 scp 更复杂。如果你想把 bar 目录复制到 server 服务器上,除了指定 ssh 信息外,相应的 scp 命令和 cp 命令一模一样。
$ scp-r bar/ me@server:/home/me/
对于 rsync,考虑的因素比较多,因为它是一个比较强大的工具。首先,我们来看一下最简单的形式:
$ rsync -r bar/ me@server:/home/me/
看起来很简单吧?对于只包含目录和普通文件的简单情况,这就可以了。然而,rsync 更在意发送与主机系统中一模一样的文件。让我们来创建一个稍微复杂一些,但并不罕见的例子:
#创建多级目录结构
$ mkdir-p bar/baz
#在其根目录下创建文件
$ touch bar/foo.txt
#现在创建一个符号链接指回到该文件
$ cd bar/baz
$ ln-s ../foo.txt link.txt
#返回原位置
$ cd-
现在我们有了一个如下的目录树:
bar
├── baz
│└──link.txt ->../foo.txt
└── foo.txt
1 directory,2 files
如果我们尝试上面的命令来复制 bar,我们会注意到非常不同的(并令人惊讶的)结果。首先,我们来试试 scp:
$ scp-r bar/ me@server:/home/me/
如果你 ssh 进入你的服务器,看看 bar 的目录树,你会发现它和你的主机系统有一个重要而微妙的区别:
bar
├── baz
│└──link.txt
└── foo.txt
1 directory,2 files
请注意,link.txt 不再是一个符号链接,它现在是一个 foo.txt 的完整副本。如果你习惯于使用 cp,这可能会是令人惊讶的行为。如果你尝试使用 cp -r 复制 bar 目录,你会得到一个新的目录,里面的符号链接和 bar 的一样。现在如果我们尝试使用之前的 rsync 命令,我们会得到一个警告:
$ rsync -r bar/ me@server:/home/me/
skipping non-regular file"bar/baz/link.txt"