如何使用 SCP 移动文件?

如何使用 SCP 移动文件?

如何不复制而是将文件从一台服务器移动到另一台服务器(均为 Linux)?

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

也许我应该以某种方式使用退出代码,但怎么用呢?此外,文件太多,如果最后一个文件失败,那么保留一大堆成功传输的文件将不是一个好的选择。

也许除了 SCP 之外还有别的东西?

答案1

通过 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是默认的,所以可以省略。

答案2

使用rsync而不是scp

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

更多信息请见man rsync

答案3

这个问题已经得到很好的回答,答案也被接受了,但由于它已经浮到首页顶部,我想我至少应该尝试更准确地回答它,尽管不那么优雅。是的,您可以使用 的返回代码scp,我经常这样做。在bash

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

我接受您关于复制多个文件并正确处理堆栈故障的观点,因此对于多个文件:

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

最后这一点只有在您使用时才实用ssh-agent,但我非常希望您使用。

答案4

在我的例子中,ssh 端口不是 22,因此

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

对我有用。

相关内容