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

评论

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

#1 楼

如果只想更新原始目录中较新的文件,请使用rsync并传递-u,或者使用--ignore-existing跳过目标中已经存在的所有文件。 >(请注意/在源代码一侧:没有rsync会创建/remote/directory/directory。)

评论


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

–吉尔斯'所以-不再是邪恶的'
13年11月27日在9:59

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

–安东
13年11月27日在10:08

如果远程系统没有易于使用的rsync,这将无济于事。(例如Win32-OpenSSH)

– Gert van den Berg
16-10-25在8:00

@GertvandenBerg rsync很容易在Windows上安装,没有比SSH难。

–吉尔斯'所以-不再是邪恶的'
16-10-25在11:51

@Gilles:的确如此,但是所有选项似乎都包含Cygwin DLL ...(OpenSSH的MS端口的当前状态是,在scp上启用压缩足以破坏SCP ...)(通过Win32获得rsync功能) -OpenSSH似乎也很简单-希望随着时间的推移会有所改善)(另一个示例是Solaris 10,其中需要第三方软件包和--rsync-path

– Gert van den Berg
16-10-25在13:01



#2 楼

如果您具有对文件的写许可权,scp将覆盖它们。文件的所有者,即。)

评论


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

–糖精
13年7月16日在21:02

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

–里克
15年5月27日在19:16

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

–ling
16年8月21日在19:58

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

– sancho.s ReinstateMonicaCellio
18年5月20日在12:55

要在Windows上选择所有文件,请右键单击->属性->只读

– BenJammin
'18 Sep 6'在15:17

#3 楼

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

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


,然后再运行scp(它将抱怨并跳过现有文件)。 >然后将其改回(chmod +w以获取基于umask的值)。如果文件
都没有根据您的umask拥有写权限,则您将不得不存储该权限,以便可以还原它们。它们是较新的,这样我就丢失了宝贵的数据。不明白为什么这个错误和有害的答案有这么多的赞成票。

评论


我不明白:rsync --ignore-existing如何导致您丢失数据?

–吉尔斯'所以-不再是邪恶的'
13年11月27日在10:01

我发现错误:使用此命令缺少“ -exec”参数,而不得不使用:find。 -类型f -exec chmod a-w {} \;。我的Linux不好,ymmv。

–wpearse
2015年4月6日在0:16



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

–阿米尔
17-10-17在16:41

#4 楼

您只能按日期复制新文件。使用联机帮助中的find
scp  `find /data/*.gz -type f -mtime +7` USER@SERVER:/backup/

-atime是最后一次访问的时间,但原理是相同的):小时前。如果找出最近一次访问文件有24小时的时间,则会忽略任何小数部分,因此要匹配-atime n,必须至少在两天前访问文件。


评论


+7是什么意思?

– Francis Kim
17年5月1日在13:07

@FrancisKim意味着7天前已修改。因此,此查询选择了过去7天内修改过的所有* .gz文件

–Vadim Eremeev
17年5月24日在21:34

+7实际上不是暗示7天以上吗?

–杰夫
18年3月21日在22:51

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

– Stefan Reich
18/12/12在14:59

#5 楼

我有类似的任务,在我的情况下,我无法使用rsynccsync或FUSE,因为我的存储只有SFTP。 rsync无法更改文件的日期和时间,其他一些实用程序(例如csync)向我显示了其他错误:“无法创建检测到时钟偏斜的临时文件”。
-server-只需安装openssh-server或在此处将rsync作为守护程序启动。 lftp用于同步的用法如下:

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

评论


极好!虽然它不是使用scp(作为二进制文件),而是使用sftp(作为相同的协议),但是当sftp是唯一可用的协议时,它有助于实现同步-因此没有ssh,因此也没有rsync,ls,tar或其他任何协议建议的解决方案。谢谢!顺便说一句,如果要将远程文件夹镜像到本地文件夹,只需删除“ -R”标志。

–马丁·吕格(MartinRüegg)
20年6月14日在10:59

太棒了,这对我也很有效。只是一些笔记。小心使用-R,如果不存在则删除它们(相信它类似于rsync中的--delete标志)。 / rem / folder是相对路径。因此,如果要将内容复制到基本路径,则可以执行以下操作:sftp://stf.domain.tld/; ...... / src / folder ../../

–塞恩·布雷肯里奇(Sean Breckenridge)
20-6-29在1:31



#6 楼

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

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


评论


它确实建立了远程连接。首先,它是源代码tar,将其通过管道连接到ssh连接,然后在远程系统上解压缩。

– huembi
16年8月22日在21:17

#7 楼

实现此目的的另一种方法是在目标文件夹上执行ls:在远程目标文件夹上:

ls | awk '{print "mv "  " ../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
19年6月1日在21:12



#8 楼

scp确实会覆盖文件,并且没有任何开关可以阻止它执行此操作,但是您可以以某种方式复制内容,执行scp,然后再复制现有文件。示例:



复制所有现有文件

mkdir original_files ; cp -r * original_files/



使用scp复制所有内容

scp -r user@server:dir/* ./



将原始文件复制到任何已覆盖scp的内容上:

cp -r original_files/* ./




评论


当您尝试从远程提取文件并从上次中断的地方继续时,此方法无济于事。即如果整个目的是为了节省时间。

–奥利弗·威廉姆斯(Oliver Williams)
16年1月1日在17:58