web-dev-qa-db-ja.com

scpでファイルを_MOVE_する方法は?

サーバー間でファイルをコピーしないで移動する方法(両方のLinux)?

man scp役に立たなかった。ファイルが正常に転送されていることを確認する必要があるため、「scp」、次に「rm」を使用できません。転送中にエラーが発生した場合は、ファイルを削除しないでください。

おそらく、なんとなく終了コードを使用する必要がありますが、どうやって?また、多くのファイルがあり、最後のファイルが失敗した場合、それはあまり良いオプションではなく、正常に転送されたファイルの束全体を保持します。

たぶんSCP以外に何かありますか?

50
Putnik

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がデフォルトなので、省略できます。

50
Tom H

rsyncの代わりにscpを使用:

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

man rsyncで詳細をご覧ください。

20
Sven

この質問は問題なく回答され、回答は受け入れられましたが、トップページの上部に浮かび上がったので、エレガントではないにせよ、少なくとももっと正確に回答しようと思ったのです。はい、scpからの戻りコードを使用できます。私は頻繁に使用しています。 bash内:

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

複数のファイルをコピーし、スタックの障害を正しく処理するために、複数のファイルの場合は次のように説明します。

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

これは、ssh-agentを使用している場合にのみ実用的ですが、私はあなたがそうであると非常に願っています。

18
MadHatter

2つのステップでそれが問題にならない場合は、scpを使用してリモートサーバーからファイルをコピーし、次にssh -e "rm /path/to/file"を実行してディスクから削除できます。特にマシン間でファイルを移動する場合、問題が発生する可能性があるため、コピーと削除を別々に実行し、最初に正常にコピーされたことが確実にわかっている場合にのみファイルを削除することをお勧めします。

3
Giannis

私のように古いターゲットサーバーがある場合は、使用できません

--remove-source-files

しかし、あなたは使用する必要があります

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

代わりに。

3
andrej

私の状況では、sshポートは22ではないので、

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

私のために働く。

3
bigCat

私が見つけたrsyncの代替であるlftpをお勧めしますが、rsyncにはsftpサーバーがブロックするシェルアクセスが必要であるためです。

lftp -e "mirror --Remove-source-files ./remote/path/ /local/path/; quit" remoteuser@remotehost:

これをバッチプロセス/ cronジョブの一部として実行する必要がある場合は、パスワードを渡すこともできます(明らかに安全ではありません)。

lftp --password hunter2 -e "mirror --Remove-source-files ./remote/path/ /local/path/; quit" remoteuser@remotehost:
0
Andy C