如何使用“ scp”命令仅复制新文件?


24

我使用出现错误scp命令将数百个文件复制到另一台计算机。现在,我将再次复制文件。有什么方法可以避免复制已经复制的文件?stalled

Answers:


40

您可以使用rsync它。rsync确实是针对此类操作而设计的。

句法:

rsync -avh /source/path/ host:/destination/path

要么

rsync -a --ignore-existing /local/directory/ host:/remote/directory/

首次运行时,它将复制所有内容,然后仅复制新文件。

如您最初要求基于SCP的解决方案所指示的,如果您需要通过SSH连接(例如,出于保密目的)通过隧道传输流量,则只需将-e ssh参数添加到中rsync。例如:

rsync -avh -e ssh /source/path/ host:/destination/path

是否--ignore-existing真的需要?
Meysam,2013年

因为在本手册的示例中:rsync -t *.c foo:src/->“这会将所有与* .c模式匹配的文件从当前目录传输到机器foo上的目录src。如果远程系统上已经存在任何文件,则rsync remote-更新协议用于通过仅发送差异来更新文件
Meysam 2013年

1
我通常使用rsync -avuzh /source/path/ host:/destination/path。这样就可以在一个命令中完成整个工作,并且在随后的调用中,仅传输需要它的文件。
Edward Falk

6

如果出于任何原因要坚持使用scp,则可以删除本地数据上的w权限(如果您有权这样做),而scp不会碰它。更准确地说:

  1. chmod a-w local/*.tar.gz (在您的本地目录中)
  2. scp remote/*.tar.gz local

这不是很有效,很好,但是如果您需要快速的临时解决方案而不更改为scp以外的其他方法,则可能会有所帮助。(荣誉:scp而不替换目标中的现有文件


我真的很喜欢这个解决方案。我正在将来自远程传感器的文件收集到存档中。整个工作目录-每个都有一个Archive子目录。一旦文件进入存档,它们将永远不会被更改。将存档文件标记为-w真的很容易,所以这就是我要做的。存档目录之外的工作文件可以保留原样,因此,如果我在白天运行更新程序,它将仍然复制正在进行的文件。这正是我想要的。TNX多大!
SDsolar '17

4

关于如何使用SCP进行此操作没有确切的答案,因为这就是最初的问题。

sudo find /files/ -type f -exec chmod a-w {} \;

scp -r username@server.com:/file/location/* /files

复制完文件后,将权限改回来:

sudo chmod a+w -R /files


1
好吧,可以说,最初的问题是“我怎么解决这个问题”,rsync是答案。
Edward Falk
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.