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

#1 楼

是的,请使用-r

scp -rp sourcedirectory user@dest:/path



-r意味着递归
-p保留原始文件的修改时间,访问时间和模式。

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

评论


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

– CpnCrunch
15年7月24日在0:30

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

–pms
17年2月3日在14:49

#2 楼

尽管上述答案在技术上是正确的,但您也应该考虑使用rsyncrsync使用diff机制比较发送方和接收方的数据,因此不必重新发送以前发送过的数据。

如果要复制内容到远程计算机,则一次,使用rsync。实际上,每次使用rsync很好,因为它对复制文件的权限和所有权以及排除某些文件或目录具有更多控制权。通常,

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


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

rsync允许您最终,可以很容易地从中断的传输中恢复,这与scp不同。最后,现代版本的rsync默认情况下在ssh上运行,因此,如果scp已经可以正常工作,则rsync应该可以直接替换。

评论


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

–塞德里克·奈特
17年8月21日在8:54

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

– pdem
19-09-26在12:57

rsync不会加密流量,因此您需要使用额外的“ -e ssh”来加密流量,例如scp

–波佐-巴尔比
7月22日23:09

#3 楼

这就是-r选项的作用。 :)

如果需要,请参见scp手册页以获取更多信息。

#4 楼

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

scp -r


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

cp -R


评论


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

–塔伦
2013年9月23日14:54



#5 楼

最好的方法是通过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。而且,用于连接到远程主机的命令的选择实际上与递归复制无关。

–卡巴斯德
2015年11月5日在19:03

#6 楼

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

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

我最后所做的是:

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,因为该文件是压缩的tar存档(因为使用了-z标志)。

–蒽铃
18年3月26日在22:07

#7 楼

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

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 ...

#8 楼

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

示例:

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


#9 楼

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

评论


的确如此,-r选项早在几年前就已经提出,并且是公认的答案。

– RalfFriedl
19年4月22日在16:05

#10 楼

另一个(可能更好地重复使用)选项是使用NFS-检查nfs-kernel-server以及如何设置NFS共享。

评论


这是完全废话。在无数情况下,您将使用scp,但NFS则不可行。

– Sven
16年8月11日在23:24