题 scp可以递归复制目录吗?


目前我只能复制一个 .tar 文件。但是如何递归复制目录 scp


518
2018-04-29 04:24






答案:


是的,使用 -r

scp -rp sourcedirectory user@dest:/path
  • -r表示递归
  • -p保留原始文件的修改时间,访问时间和模式。

注意:这会创建 sourcedirectory 内 /path 因此文件将在 /path/sourcedirectory


838
2018-04-29 04:28



但请记住,这不会保留符号链接。 - CpnCrunch
注意 -pr (颠倒顺序的选项)不会复制文件夹,而是将其内容复制到目标目录(显然,选项的顺序很重要)。 - pms
由于某些原因 /path 似乎是相对的 user小号 $HOME  - 如果没有,我怎么做到绝对 root@? - Jonathan
是的,SCP从不把文件放在我想要的地方。通常在尝试替换目录时,我会以某种方式最终使用相同名称的其他目录。我对此非常小心。 - sudo


虽然以前的答案在技术上是正确的,但您也应该考虑使用 rsync 代替。 rsync 将发送方和接收方的数据与diff机制进行比较,因此不必重新发送先前已发送的数据。

如果要将某些内容复制到远程计算机上多次,请使用 rsync。实际上,它很好用 rsync 每次都因为它有更多控件来复制文件权限和所有权以及排除某些文件或目录。一般来说:

$ rsync -av /local/dir/ server:/remote/dir/

将本地目录与远程目录同步。如果再次运行它并且本地目录的内容没有更改,则不会传输任何数据 - 比运行更有效 scp 并且每次都复制一切。

也, rsync 与之相比,您可以非常轻松地从中断传输中恢复 scp

最后,现代版本 rsync 默认情况下运行ssh,所以如果 scp 已经在工作了 rsync 应该是一个替代品。


149
2018-04-29 05:11



“没有数据将被转移”,当然,除了确定具有或未经改变的数据所需的数据。 - thsutton
哈,是的,我有点明显地掩饰了这一点。我们这里不是在谈论量子纠缠。 - Phil Hollenback
令人伤心的是,osx,win7甚至ubuntu都没有使用像rsync这样的GUI。 - cregox
dmourati我确实回答了他的问题。我告诉他一个更好的方法。 - Phil Hollenback
@raphnguyen:不,从本地目录中删除文件不会从远程目录中删除它们。您可以使用以下命令启用此行为 --delete rsync选项。 - Phil Hollenback


那是什么的 -r 选项是为了。 :)

scp man page 如果需要更多信息。


30
2018-04-29 04:27





递归复制选项'-r'(小写)

scp -r

我把它与常规的本地递归复制选项'-R'混淆(大写)

cp -R

9
2017-09-11 17:53



我只是想指出cp和scp之间的区别,因为-r和-R不一样。 unix.stackexchange.com/questions/18712/... - Tarun


最好的方法是通过SSH使用rsync

rsync -a -essh /source/ user@dest-server:/dest/

rsync -a -essh user@source-server:/source/ /dest/

我最喜欢的选项是-Pazvessh --delete:

  • -a:存档模式(包括许多默认的常用选项,包括保留符号链接)
  • -z:压缩
  • -v:详细:显示文件
  • -P:将文件显示为文件已完成/剩余文件
  • -e ssh:在ssh协议中执行rsync
  • --delete:删除目标中不再存在的文件

4
2017-11-05 18:33



所有版本的 rsync 我用过的会使用 ssh 默认情况下,所以 -essh 不太可能需要。用于连接远程主机的命令选择与递归复制无关。 - kasperd


在寻找递归复制标志后,由于这篇文章成功使用它,我想发布一个建议。

如果是你正在复制(递归)目录。也许如果文件被压缩发送,您可以节省传输时间

我最后做的是:

local$ tar -czvf local.tar.gz directory/
local$ scp local.tar.gz user@remote:/directory
ssh user@remote
remote$ tar -xzvf local.tar.gz

希望这可以帮助


3
2018-06-06 18:00



文件扩展名应该是 .tar.gz 要么 .tgz 因为该文件是一个gzipped tar存档(因为 -z 使用标志)。 - anthonybell


您可以使用以下简单命令以递归方式将目录复制到压缩存档中:

ssh -p 22 user@address-to-copy-from.com  'cd /parent/directory && tar zcvf - directory_to_copy' > /destination/on/your/machine/archive_name.tgz

例如,要复制内容 /var/log 从 domain.com 至 ~/logs.tgz 你跑:

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' > ~/logs.tgz

您还可以使用管道在目标系统上提取文件。此命令将复制内容 /var/log 在 domain.com 至 ~/destination/log 在你的系统上:

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' | tar xzf - -C ~/destination

虽然镜像目录,但您可能应该使用 rsync...


1
2018-01-06 07:20