如何不复制而是将文件从一台服务器移动到另一台服务器(均为 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/
对我有用。