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


46

あるサーバーから別のサーバーにファイルをコピーせずに移動する方法(両方ともLinux)

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

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

たぶん、SCP以外の何かがありますか?

回答:


47

おそらく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はデフォルトなので省略できます。


7
-e sshこれは長年の暗黙のデフォルトであり、通常はこのパラメーターを使用する必要は通常ありません。
スヴェン

@SvenW知っててよかった!scpはほとんどの目的で再帰モードをサポートしているため、日々のrsyncの必要性はあまりありません。
トムH

:その使用後これは、任意の空のフォルダ(rsyncはそれらを削除しません)クリーンアップするserverfault.com/a/95935/58568
bmaupin

1
smv() { rsync -az --remove-source-files "$@"; }ツールボックスに追加しました。ありがとうございました。
リースウーレリッチ14年

rsyncがない場合はどうなりますか?たとえば、OpenWrtにはrsyncがなく、scpを使用してファイルを移動する必要があります。今何をする?
バレンタイン

19

rsync代わりに使用scp

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

詳細はをご覧くださいman rsync


17

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

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

複数のファイルについては、スタックの障害を正しくコピーして処理するために複数のファイルについて指摘します。複数のファイルの場合:

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

この最後はssh-agent、を使用している場合にのみ実用的です。


1
これが答えだったはずです。質問に正確に答えます。
トラビスグリッグス

SCPは帯域幅の制限(AFAIK)を処理しないため、ranswerとhanswerを使用して、定義された帯域幅でファイルを1つずつ移動しました。ありがとう!
ムーンチャイルド

@ Moonchild、scpは実際に-lフラグを使用して帯域幅制限を処理できます。たとえば、-l 8192転送を8192 kb / sで制限するには
スペンサーD

3

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

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

私のために働く。


5
すべてのコマンドで指定するよりも、カスタムsshポート番号をssh構成ファイル(〜/ .ssh / config)に入れる方がはるかに優れています。グローバルに、ホストごとに、またはホスト名に一致する正規表現に対して指定できます。
こっそり14

送信元と宛先の両方でポートを個別に設定する方法は?
-Brethlosze

3

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

--remove-source-files

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

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

代わりに。


3

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.