サーバー間でファイルをコピーしないで移動する方法(両方のLinux)?
man scp
役に立たなかった。ファイルが正常に転送されていることを確認する必要があるため、「scp」、次に「rm」を使用できません。転送中にエラーが発生した場合は、ファイルを削除しないでください。
おそらく、なんとなく終了コードを使用する必要がありますが、どうやって?また、多くのファイルがあり、最後のファイルが失敗した場合、それはあまり良いオプションではなく、正常に転送されたファイルの束全体を保持します。
たぶんSCP以外に何かありますか?
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
がデフォルトなので、省略できます。
rsync
の代わりにscp
を使用:
rsync -avz --remove-source-files /sourcedir user@Host:/targetdir
man rsync
で詳細をご覧ください。
この質問は問題なく回答され、回答は受け入れられましたが、トップページの上部に浮かび上がったので、エレガントではないにせよ、少なくとももっと正確に回答しようと思ったのです。はい、scp
からの戻りコードを使用できます。私は頻繁に使用しています。 bash
内:
scp foo user@server:/destination && rm foo
複数のファイルをコピーし、スタックの障害を正しく処理するために、複数のファイルの場合は次のように説明します。
for file in bar*; do scp "$file" user@server:/destination && rm "$file" ; done
これは、ssh-agent
を使用している場合にのみ実用的ですが、私はあなたがそうであると非常に願っています。
2つのステップでそれが問題にならない場合は、scp
を使用してリモートサーバーからファイルをコピーし、次にssh -e "rm /path/to/file"
を実行してディスクから削除できます。特にマシン間でファイルを移動する場合、問題が発生する可能性があるため、コピーと削除を別々に実行し、最初に正常にコピーされたことが確実にわかっている場合にのみファイルを削除することをお勧めします。
私のように古いターゲットサーバーがある場合は、使用できません
--remove-source-files
しかし、あなたは使用する必要があります
--remove-sent-files --protocol=29
代わりに。
私の状況では、sshポートは22ではないので、
rsync -avz --remove-source-files -e "ssh -p $portNumber" user@remoteip:/path/to/files/ /local/path/
私のために働く。
私が見つけた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: