如何使用 scp _MOVE_ 文件?

Put*_*nik 56 networking linux scp

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

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

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

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

Tom*_*Tom 57

rsync over ssh 可能是你最好的--remove-source-files选择

rsync -avz --remove-source-files -e ssh /this/dir remoteuser@remotehost:/remote/dir 
Run Code Online (Sandbox Code Playgroud)

快速测试给出;

[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
Run Code Online (Sandbox Code Playgroud)

正如@SvenW 提到的,-e ssh是默认值,因此可以省略。

  • `-e ssh` 是多年来的隐式默认值,通常不再需要使用此参数。 (9认同)
  • 刚刚添加了 `smv() { rsync -az --remove-source-files "$@"; }` 到我的工具箱。谢谢你。 (2认同)

Sve*_*ven 23

使用rsync代替scp

rsync -avz --remove-source-files /sourcedir user@host:/targetdir 
Run Code Online (Sandbox Code Playgroud)

更多信息与man rsync


Mad*_*ter 20

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

scp foo user@server:/destination && rm foo
Run Code Online (Sandbox Code Playgroud)

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

for file in bar*; do scp "$file" user@server:/destination && rm "$file" ; done
Run Code Online (Sandbox Code Playgroud)

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

  • 我觉得这应该就是答案。它准确地回答了所提出的问题。 (2认同)

小智 5

如果分两步完成没有问题,您可以使用scp从远程服务器复制文件,然后执行ssh -e "rm /path/to/file"从磁盘删除。当移动文件时,尤其是在机器之间移动时,可能会出现问题,因此最好分别执行复制和删除,并且仅在确定文件已成功复制时才删除该文件。