Bagaimana cara _MOVE_ file dengan scp?

46

Bagaimana cara tidak menyalin tetapi memindahkan file dari satu server ke yang lain (keduanya Linux)?

man scptidak memberi saya sesuatu yang berguna. Saya tidak dapat menggunakan 'scp' lalu 'rm' karena saya harus memastikan file tersebut berhasil ditransfer. Jika ada kesalahan selama transfer, file tidak boleh dihapus.

Mungkin saya harus menggunakan kode keluar entah bagaimana, tapi bagaimana caranya? Juga, ada banyak file, dan jika file terakhir gagal itu tidak akan menjadi pilihan yang baik menjaga seluruh file yang berhasil ditransfer.

Mungkin ada sesuatu selain SCP?

Putnik
sumber

Jawaban:

47

rsync over ssh mungkin adalah taruhan terbaik Anda dengan --remove-source-filesopsi

rsync -avz --remove-source-files -e ssh /this/dir remoteuser@remotehost:/remote/dir 

tes cepat memberi;

[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

Seperti yang disebutkan @SvenW, -e sshadalah standar sehingga dapat dihilangkan.

Tom H
sumber
7
-e sshadalah standar implisit selama bertahun-tahun sekarang, biasanya tidak perlu lagi menggunakan parameter ini.
Sven
@VenW ah senang tahu! Saya tidak perlu banyak rsync hari ke hari karena scp mendukung mode rekursif untuk sebagian besar tujuan.
Tom H
Setelah itu gunakan ini untuk membersihkan folder kosong (rsync tidak akan menghapusnya): serverfault.com/a/95935/58568
bmaupin
1
Baru saja ditambahkan smv() { rsync -az --remove-source-files "$@"; }ke kotak alat saya. Terima kasih.
Rhys Ulerich
Bagaimana jika Anda tidak memiliki rsync? Misalnya OpenWrt tidak memiliki rsync dan saya perlu menggunakan scp untuk memindahkan file. Apa yang harus dilakukan sekarang?
valentt
19

Gunakan rsyncalih-alih scp:

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

Info lebih lanjut dengan man rsync.

Sven
sumber
17

Pertanyaan ini sudah dijawab dengan baik, dan jawabannya diterima, tetapi karena itu melayang ke bagian atas halaman depan, saya pikir saya setidaknya akan mencoba untuk menjawabnya lebih tepat, jika kurang elegan. Ya, Anda dapat menggunakan kode pengembalian dari scp, dan saya sering melakukannya. Dalam bash:

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

Saya mengambil poin Anda tentang banyak file untuk menyalin dan menangani kegagalan ke tumpukan dengan benar, jadi untuk beberapa file:

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

Yang terakhir ini hanya praktis jika Anda menggunakan ssh-agent, tetapi saya sangat berharap Anda melakukannya.

MadHatter mendukung Monica
sumber
1
Saya merasa ini seharusnya jawabannya. Itu menjawab pertanyaan yang diajukan dengan tepat.
Travis Griggs
Karena SCP tidak menangani batasan bandwidth (AFAIK), saya menggunakan hanswer Anda dengan rsync untuk memindahkan file satu per satu pada bandwidth yang ditentukan. Terima kasih!
Moonchild
@Moonchild, scp sebenarnya bisa menangani batas bandwidth menggunakan -lflag. Misalnya, -l 8192untuk membatasi transfer pada 8192 kb / s
Spencer D
3

dalam situasi saya, port ssh bukan 22, jadi

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

bekerja untukku.

kucing besar
sumber
5
Anda jauh lebih baik memasukkan nomor port ssh kustom ke dalam file konfigurasi ssh Anda (~ / .ssh / config) daripada menentukannya untuk setiap perintah. Itu dapat ditentukan secara global, per-host, atau untuk ekspresi reguler yang cocok dengan nama host.
menyelinap
Bagaimana mengatur port secara individual baik untuk sumber dan tujuan?
Brethlosze
3

jika Anda memiliki server target yang lebih lama seperti saya, Anda tidak dapat menggunakan

--remove-source-files

tetapi Anda harus menggunakan

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

sebagai gantinya.

andrej
sumber
3

Jika melakukannya dalam dua langkah bukan masalah, Anda dapat menggunakan scpuntuk menyalin file dari server jauh, dan kemudian jalankan ssh -e "rm /path/to/file"untuk menghapus dari disk. Ketika memindahkan file terutama di antara mesin, ada yang salah, jadi mungkin baik untuk melakukan penyalinan dan menghapus secara terpisah, dan hanya menghapus file ketika Anda tahu pasti telah berhasil disalin terlebih dahulu.

Giannis
sumber