本文将为熟悉 scp
的人提供一个介绍和过渡的指南。让我们跳进最常见的场景:复制文件和复制目录。
复制文件
对于复制单个文件而言,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"