如何使用scp _MOVE_文件?

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

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

也许我应该使用退出代码,但如何? 另外,还有很多文件,如果最后一个文件失败了,那就不是那么好的select,保留了大量成功传输的文件。

也许除了SCP之外还有什么东西?

rsync over ssh可能是使用--remove-source-files选项的最佳select

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

一个快速testing给出;

 [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是默认值,所以可以省略。

使用rsync而不是scp

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

有关man rsync更多信息。

这个问题已经得到了很好的回答,答案也被接受了,但是因为它已经浮现在首页的顶部,所以我想我至less会试着更精确地回答它,如果不那么优雅的话。 是的,你可以使用scp的返回码,而且我经常这样做。 在bash

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

我把你关于多个文件的观点正确地复制并处理失败,所以对于多个文件:

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

如果你使用的是ssh-agent ,最后一个是唯一的,但是我非常希望你能。

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

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

为我工作。

如果两步操作不成问题,可以使用scp从远程服务器复制文件,然后执行ssh -e "rm /path/to/file"从磁盘中删除。 特别是在机器之间移动文件时,可能会出错,所以单独执行复制和删除操作可能会比较好,并且只有在确定已经成功复制后才能删除文件。

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

 --remove-source-files 

但你必须使用

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

代替。