Buat scp selalu menimpa atau membuat direktori

26

Saya menggunakan scp untuk menyalin direktori dari satu server jauh ke direktori baru (yaitu hanya mengubah nama) di server jauh lain seperti:

scp -prq server1:dir1 server2:dir2

Ini berfungsi dengan baik jika dir2 tidak ada pada server2, ia menciptakan direktori baru yang disebut dir2 yang berisi segalanya dari dir1 pada server1.

Masalahnya muncul ketika dir2 sudah ada di server2 (CATATAN: Saya tidak punya cara untuk mengetahui hal ini sebelumnya atau melakukan penghapusan pada dir2 di server2 sebelumnya) - yang terjadi adalah saya mendapatkan salinan dir1, disebut dir1, di dir2.

Saya yakin ada sesuatu yang mendasar yang saya lewatkan, tetapi sepertinya saya tidak bisa menyelesaikannya.

Setiap bantuan sangat dihargai!

Salam,

Giles

Oke, saya punya kurang dari 10 rep dan tidak bisa menunggu 8 jam jadi di sini adalah apa yang saya dapatkan:

Berikut ini skrip yang berfungsi untuk saya:

#!/bin/sh
echo "method 1"
scp -prq server1:dir1/* server2:dir2/ >/dev/null  2>&1

if [ "$?" -ne "0" ]; then
        echo "failed ... trying method 2"
        scp -prq server1:dir1 server2:dir2
fi

exit

Masih tidak yakin bagaimana melakukan ini dalam satu perintah atau bahkan jika memungkinkan.

Cheers @mindthemonkey, terkadang hanya mendapatkan sudut pandang baru dapat membantu menunjukkan jalannya.

Giles
sumber
Anda memiliki akses scp tetapi tidak ssh?
Matt
Itu benar
Giles
Satu-satunya masalah di sana adalah Anda akan mencoba salinan kedua pada setiap kegagalan, yang belum tentu dir2 tidak ada. Mungkin jika Anda dapat membuat tes yang tidak melakukan apa-apa (katakan salin direktori kosong). Kemudian berdasarkan pada output baik menjalankan scp1 atau scp2
Matt
Poin bagus, saya akan mengingatnya maju dan memposting ulang jika saya datang dengan sesuatu.
Giles
Bisakah Anda sftp? kemudian periksa output dari a cd dir2.
Matt

Jawaban:

34

Gunakan sintaks "dot" ini:

scp -prq server1:dir1/. server2:dir2/

Ini menyalin isi direktori itu, bukan direktori itu sendiri. Dan saya percaya ini lebih portabel daripada *globbing.

chronospoon
sumber
2
-p ⇒ "Mempertahankan waktu modifikasi, waktu akses, dan mode dari file asli." -r ⇒ "Salin seluruh direktori secara rekursif." -q ⇒ "Menonaktifkan pengukur kemajuan." Sumber: computerhope.com/unix/scp.htm
kr85
1
Ini memberi saya kesalahan:scp: error: unexpected filename: .
Andrew Koster
1

Biasanya untuk mengontrol pembuatan direktori, Anda perlu menggunakan trailing /untuk menyiratkan path lengkap tapi saya pikir ini akan gagal membuat direktori jika tidak ada:

scp -prq server1:dir1/* server2:dir2/

Ini juga bisa melewatkan tersembunyi. file karena ekspansi * glob (tanpa pekerjaan khusus shell yang rumit )

Anda dapat mendekatinya secara berbeda dengan sshdan tar.

ssh server1 "cd dir1 && tar -cf - ." | ssh server2 "( mkdir -p dir2; cd dir2 && tar -xf - )"

Tapi ini berarti lalu lintas melalui mesin lokal Anda.

Mat
sumber
scp -prq server1: dir1 / * server2: dir2 /
Giles
@ Giles, apa maksudmu itu berhasil?
Matt
1
Aneh, saya mengeditnya tetapi hilang - tidak, itu tidak bekerja, jika direktori tidak ada maka scp memberikan kesalahan. Juga saya tidak memiliki ssh yang tersedia dalam kasus khusus ini (masalah dengan hak pengguna). Ini memang memberi saya ide, karena saya melakukan ini dalam skrip saya dapat mencoba di atas, menangkap kesalahan dan, pada kesalahan, coba versi dasar dari posting pertama saya. Terima kasih atas bantuan @mindthemonkey
Giles
1
Kesalahan 'Adalah direktori' ketika direktori tujuan tidak ada untuk saya.
Mat
1
Ya, saya juga, jenis kesalahan aneh mengingat direktori tidak ada
Giles