scp可以递归复制目录吗?


572

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

Answers:


935

是的,使用-r

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

注意:这将创建sourcedirectory内部,/path因此文件将位于/path/sourcedirectory


9
但是请记住,这不会保留符号链接。
CpnCrunch 2015年

12
注意-pr(按相反顺序排列的选项)不会复制文件夹,而是将其内容复制到目标目录(显然,选项的顺序很重要)。
PMS

171

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

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

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

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

此外rsync,不同于,您可以非常轻松地从中断的传输中恢复scp

最后,rsync默认情况下,现代版本的ssh可以运行在ssh上,因此,如果该版本scp已经rsync可以使用,则应该可以直接替换。


1
我同意rsync是更有效率的。当前不做的一件事scp是允许在远程主机之间进行复制(至少无需在其中之一上运行rsync客户端)。
Cedric Knight

1
-av:v表示冗长,a表示存档,是-rlptgoD的快捷方式,表示递归,保留权利所有者的日期和链接。如果您只想递归使用-r
pdem



6

最好的方法是通过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:删除目的地中不再存在的目标文件

rsync我使用的所有版本ssh默认情况下都会使用,因此-essh不太可能需要。而且,用于连接到远程主机的命令的选择实际上与递归复制无关。
卡巴斯德(Kasperd),2015年

4

在寻找递归复制标志并通过这篇文章成功使用了它之后,我只想提出一个建议。

如果是这种情况,则说明您正在(递归)复制目录。也许如果文件以压缩方式发送,则可以节省传输时间

我最后所做的是:

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

希望这可以帮助


文件扩展名应该为.tar.gz或,.tgz因为文件是gzip压缩的tar存档(因为使用了该-z标志)。
anthonybell '18

2

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

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/logdomain.com~/destination/log您的系统上:

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

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


1

如果您希望将用户密码作为参数而不是交互式输入,则可以使用sshpasssudo apt-get install -y sshpass)。

例:

sshpass -p 'remote_password' scp -rp /src/folder myremoteusername@122.10.12.123:/dest/folder

0

您可以将-r选项与scp命令一起使用,以在任何系统上递归复制目录。如果您还有其他需要,请参考scp命令教程。-r选项代表大多数Linux命令中的递归操作。


确实如此,但该-r选项已在几年前提出,并且是公认的答案。
RalfFriedl

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.