如何使用scp _MOVE_文件?


46

如何不将文件从一台服务器复制到另一台服务器(两个Linux)?

man scp没有给我任何有用的东西。我不能使用“ scp”然后使用“ rm”,因为我必须确保文件已成功传输。如果传输过程中出现任何错误,则不得删除该文件。

也许我应该以某种方式使用退出代码,但是如何?另外,还有很多文件,如果最后一个文件失败,那么将整个成功传输的文件保存下来并不是一个好选择。

也许除了SCP之外还有其他东西?

Answers:


47

通过ssh进行rsync可能是您最好的--remove-source-files选择

rsync -avz --remove-source-files -e ssh /this/dir remoteuser@remotehost:/remote/dir 

快速测试

[tomh@workstation001 ~]$ mkdir test1
[tomh@workstation001 ~]$ mkdir test2
[tomh@workstation001 ~]$ touch test1/testfile.1
[tomh@workstation001 ~]$ ls test1/
testfile.1
[tomh@workstation001 ~]$ rsync --remove-source-files -av -e ssh test1/testfile.1 tomh@localhost:/home/tomh/test2/
sending incremental file list

sent 58 bytes  received 12 bytes  10.77 bytes/sec
total size is 0  speedup is 0.00

[tomh@workstation001 ~]$ ls test1/
[tomh@workstation001 ~]$
[tomh@workstation001 ~]$ ls test2/
testfile.1

如@SvenW所述,-e ssh它是默认设置,因此可以省略。


7
-e ssh是多年以来的隐式默认值,通常不再需要使用此参数。
斯文

@SvenW啊,很高兴知道!我并不需要rsync,因为scp在大多数情况下都支持递归模式。
Tom H

之后,使用它来清理所有空文件夹(rsync不会删除它们):serverfault.com/a/95935/58568
bmaupin 2012年

1
刚刚添加smv() { rsync -az --remove-source-files "$@"; }到我的工具箱中。谢谢。
Rhys Ulerich 2014年

如果没有rsync怎么办?例如,OpenWrt没有rsync,我需要使用scp移动文件。现在做什么?
20:42生效

19

使用rsync代替scp

rsync -avz --remove-source-files /sourcedir user@host:/targetdir 

的更多信息man rsync


17

这个问题的答案很好,答案也可以接受,但是因为它浮在首页的顶部,所以我认为我至少会尝试更精确地回答(如果不太优雅)。是的,您可以使用中的返回码scp,而且我经常这样做。在bash

scp foo user@server:/destination && rm foo

我想就多个文件正确地复制和处理堆栈中的故障,因此对于多个文件:

for file in bar*; do scp "$file" user@server:/destination && rm "$file" ; done

仅当您使用时ssh-agent,这最后一个才是实际的,但我非常希望您能这样做。


1
我觉得这应该是答案。它准确回答了这个问题。
特拉维斯·格里格斯

由于SCP无法处理(AFAIK)带宽限制,因此我将您的hanswer与rsync一起使用,以在已定义的带宽处逐个移动文件。谢谢 !
Moonchild '18

@ Moonchildren,scp实际上可以使用该-l标志处理带宽限制。例如,-l 8192将传输限制为8192 kb / s
Spencer D

3

在我的情况下,ssh端口不是22,所以

rsync -avz --remove-source-files -e "ssh -p $portNumber" user@remoteip:/path/to/files/ /local/path/

为我工作。


5
与将自定义ssh端口号放入ssh配置文件(〜/ .ssh / config)相比,为每个命令指定它们要好得多。可以全局指定,针对每个主机指定,也可以针对与主机名匹配的正则表达式指定。
2014年

如何分别为源和目标设置端口?
Brethlosze

3

如果您像我一样拥有较旧的目标服务器,则无法使用

--remove-source-files

但是你必须使用

--remove-sent-files --protocol=29

代替。


3

如果分两个步骤进行操作不成问题,则可以使用scp来从远程服务器复制文件,然后执行ssh -e "rm /path/to/file"以从磁盘中删除文件。当尤其是在机器之间移动文件时,可能会出错,因此最好分别执行复制和删除操作,并且仅在确定先成功复制文件后才删除文件,这样可能会有所帮助。

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.