scp 而不替换目标中的现有文件

214 ssh scp rsync synchronization

如何将整个目录复制到同名目录中而不替换目标目录中的内容?(相反,我想添加到目标文件夹的内容中)

Gil*_*il' 187

如果您只想更新原始目录中较新的文件,或者跳过目标中已存在的所有文件,请使用rsync, 并传递。-u--ignore-existing

rsync -au /local/directory/ host:/remote/directory/
rsync -a --ignore-existing /local/directory/ host:/remote/directory/
Run Code Online (Sandbox Code Playgroud)

(注意/源端:没有它rsync会创建/remote/directory/directory.)

  • 如果远程系统没有易于使用的“rsync”,这没有帮助......(如 Win32-OpenSSH) (3认同)

小智 102

如果您有写权限,scp将覆盖这些文件。

换句话说:您可以scp通过暂时删除对这些文件的写权限来有效地跳过这些文件(如果您是文件的所有者,那就是)。

  • 谢谢你。正是我正在寻找的技巧。 (7认同)
  • 在不常见的情况下,只有目录中的某些文件预计会被覆盖(如果不是“受保护”),并且文件权限在文件之间不统一,则此解决方案可能不起作用。除此之外,它非常简单且有效。 (2认同)
  • 要在 Windows 上执行此操作,请选择所有文件,右键单击 -> 属性 -> 只读 (2认同)

小智 15

如果您可以将目标文件内容设为只读:

find . -type f -exec chmod a-w '{}' \;
Run Code Online (Sandbox Code Playgroud)

在运行之前scp(它会抱怨并跳过现有文件)。

然后将它们改回来(chmod +w以获得基于 umask 的值)。如果根据您的 umask,文件并非都具有写权限,则您必须以某种方式存储权限,以便您可以恢复它们。

(如果本地文件更新,Gilles 的回答会覆盖现有文件,我以这种方式丢失了有价值的数据。不明白为什么这个错误和有害的答案有这么多投票)。

  • 使用此命令时,我收到错误 `find: missing argument to '-exec'`,而不得不使用: `find 。-type f -exec chmod aw {} \;`。我的 linux 不好,ymmv。 (4认同)
  • 我不明白:`rsync --ignore-existing` 是如何导致您丢失数据的? (2认同)

小智 14

您只能按日期复制新文件。用find

scp  `find /data/*.gz -type f -mtime -7` USER@SERVER:/backup/
Run Code Online (Sandbox Code Playgroud)

联机帮助页-atime上次访问时间,但原理是相同的):

-atime n

上次访问文件n * 24 小时前。当找出多少个24小时周期前的上次访问文件,小数部分被忽略,因此如果要匹配数字-atime +1,文件必须已至少访问两个天前。>


小智 8

我有一个类似的任务,在我来说,我不能用rsynccsync因为我的存储只有SFTP,或保险丝。rsync无法更改文件的日期和时间,其他一些实用程序(如csync)向我显示了其他错误:“无法创建临时文件检测到时钟倾斜”。

如果您有权访问存储服务器 - 只需在此处作为守护程序安装openssh-server或启动rsync

就我而言 - 我不能这样做,解决方案是:lftplftp的同步用法如下:

lftp -c "open -u login,password sftp://sft.domain.tld/; \
    mirror -c --verbose=9 -e -R -L /srs/folder /rem/folder"
Run Code Online (Sandbox Code Playgroud)

/src/folder- 是我电脑上的文件夹,/rem/folder- 是sftp://sft.domain.tld/rem/folder.

您可以通过以下链接找到手册页:http : //lftp.yar.ru/lftp-man.html


小智 7

要复制一大堆文件,将它们压缩会更快。通过使用 -k 还可以防止 tar 在目标系统上解压缩文件时覆盖文件。

tar -c <source-dir> | ssh <name>@<host> 'tar -kxzf - -C <target-dir>' 
Run Code Online (Sandbox Code Playgroud)