it-swarm.cn

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

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

169
biznez

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

rsync -au /local/directory/ Host:/remote/directory/
rsync -a --ignore-existing /local/directory/ Host:/remote/directory/

(请注意/在源端:如果没有rsync会创建/remote/directory/directory。)

149

scp 如果您具有文件写入权限,则将覆盖它们。

换句话说:通过暂时删除对它们的写许可权,可以使scp有效地跳过所说的文件(也就是说,如果您是文件的所有者)。

88
Reimund

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

scp  `find /data/*.gz -type f -mtime +7` [email protected]:/backup/
12
Naks

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

find . -type f -exec chmod a-w '{}' \;

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

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

(如果在本地,Gilles的答案会覆盖现有文件,如果它们是较新的,我会丢失有价值的数据。不明白为什么这个错误和有害的答案会有如此之多的票数)。

10
Mohad

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

tar -c <source-dir> | ssh <name>@<Host> 'tar -kxzf - -C <target-dir>' 
7
huembi

我有类似的任务,在我的情况下,我无法使用rsynccsync或Fuse,因为我的存储只有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"

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

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

6
bolD

scp确实会覆盖文件,并且没有任何开关可以阻止它这样做,但是您可以以某种方式进行复制,执行scp,然后将现有文件复制回去。例子:

  1. 复制所有现有文件

    mkdir original_files ; cp -r * original_files/
    
  2. 使用scp复制所有内容

    scp -r [email protected]:dir/* ./
    
  3. 将原始文件复制到scp覆盖的所有内容上:

    cp -r original_files/* ./
    
0
A.Badger