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


158

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


是的,当有用的程序/实用程序没有一个“如果可能的话...”选项时,这烦人!在这种情况下,“-noclobber”!
MikeW

Answers:


139

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

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

(请注意/源代码方面的:如果没有,rsync则会创建/remote/directory/directory。)


@Anthon我不明白您的评论,也看不到chandra的回答或评论。--ignore-existing添加而不替换,您会看到什么数据丢失?
吉尔斯2013年

抱歉,我只看了第一个示例,该示例可能会导致数据丢失(恕我直言,不是OP所要求的),如果您包括--ignore-existing-data-loss应该不会发生。
Anthon

如果远程系统不rsync容易使用,这将无济于事。...(例如Win32-OpenSSH)
Gert van den Berg,2016年

@GertvandenBerg rsync非常容易在Windows上安装,没有比SSH难。
吉尔斯(Gilles)

@Gilles:的确如此,但是所有选项似乎都包含Cygwin DLL ...(OpenSSH的MS端口的当前状态使得对scp启用压缩足以破坏SCP ...)(通过Win32获得rsync功能) -OpenSSH似乎也不是一件容易的事-希望随着时间的推移而改善)(Solaris 10是另一个示例,--rsync-path需要第三方软件包)
Gert van den Berg 2016年

82

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

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


5
谢谢你 正是我要找的技巧。
saccharine

确保将文件复制回去,并添加*。示例scp -r user@server.com:/location/of/files/* /local/location/
Rick

1
找 。-type f -exec chown root:root {} \;
2016年

1
在不常见的情况下,预计仅目录中的某些文件会被覆盖(如果未“保护”),并且文件之间的文件权限不一致,则此解决方案可能无法正常工作。否则,它非常简单有效。
sancho.s

要在Windows上执行此操作,请选择所有文件,右键单击->属性->只读
BenJammin

12

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

scp  `find /data/*.gz -type f -mtime +7` USER@SERVER:/backup/

+7是什么意思?
弗朗西斯·金

@FrancisKim意味着7天前已修改。因此,该查询选择了过去7天内修改过的任何* .gz文件
Vadim Eremeev'May

4
+7实际上不是暗示7天以上吗?
杰夫H.18年

1
是的,它的意思是“超过7天前”。不知道谁支持这个。
Stefan Reich

9

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

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

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

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

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


2
我不明白:是怎么rsync --ignore-existing导致您丢失数据的?
吉尔斯2013年

4
find: missing argument to '-exec'使用此命令时出现错误,而不得不使用:find . -type f -exec chmod a-w {} \;。我的Linux不好,ymmv。
wpearse 2015年

这是一个更好,更安全的答案。更改权限的正确命令如@wpearse所述:find . -type f -exec chmod a-w {} \;
Amir

6

我有一个类似的任务,在我来说,我不能用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"

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

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


6

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

tar -c <source-dir> | ssh <name>@<host> 'tar -kxzf - -C <target-dir>' 

1
它确实建立了远程连接。首先,它是源文件tar,将其通过管道连接到ssh连接,然后将其解压缩到远程系统上。
huembi '16

-1

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

  1. 复制所有现有文件

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

    scp -r user@server:dir/* ./
    
  3. 将原始文件复制到scp覆盖的所有内容上:

    cp -r original_files/* ./
    

3
当您尝试从远程提取文件并从上次中断的地方接管时,此方法无济于事。即,整个目的是为了节省时间。
奥利弗·威廉姆斯

-1

实现此目的的另一种方法是ls在目标文件夹上执行以下操作:

在远程目标文件夹上:

ls | awk '{print "mv " $1 " ../copied_data/"}' > mv_copied_data
scp mv_copied_data user@source.server.com:/path/to/source/folder

来源:

cd /path/to/source/folder
chmod 777 mv_copied_data
./mv_copied_data

在目的地:

scp -r user@source.server.com:/path/to/source/folder /path/to/destination/foldeer

请不要这样做。1. 不要解析ls。2.如果任何文件名包含- >空格换行符或其他特殊字符,答案都是危险的。3.在python脚本中硬编码for循环。由于许多原因,在运行时生成程序是困难且棘手的(即使由专业程序员完成)。生成shell脚本甚至更糟-一个糟糕的主意。
ignis
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.