Scp'yi her zaman üzerine yaz veya dizin oluştur


26

Bir dizini bir uzak sunucudan yeni bir dizine (IE sadece adı değiştirerek) kopyalamak için scp kullanıyorum:

scp -prq server1:dir1 server2:dir2

Bu, server2'de dir2 bulunmuyorsa, server1'deki dir1'den her şeyi içeren dir2 adlı yeni bir dizin oluşturur.

Bu sorun, server2'de dir2 zaten mevcut olduğunda ortaya çıkar (NOT: Bunu önceden bilmeden veya server2'de dir2'yi kaldırmadan önce yapma şansım yok) - ne olur dir1, dir2, dir2, dir2.

Kaybettiğim basit bir şey olduğundan eminim, ama çözemiyorum.

Herhangi bir yardım çok takdir!

Saygılarımızla,

Giles

Tamam, 10'dan az temsilcim var ve 8 saat bekleyemem mümkün değil, işte elimde ne var:

İşte benim için çalışan bir senaryo:

#!/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

Yine de bunu tek bir komutta veya mümkünse bile nasıl yapacağınızdan emin değilim.

Şerefe @mindthemonkey, bazen sadece yeni bir bakış açısı elde etmenin yolu göstermesine yardımcı olabilir.


scp erişiminiz var ama ssh değil mi?
Matt

Bu doğru
Giles

Buradaki tek sorun, ikinci kopyayı, mutlaka bulunmayan dir2 olmayan herhangi bir arızada deneyeceksiniz. Belki de hemen hemen hiçbir şey yapmayan bir testle karşılaşırsanız (boş bir dizin kopyalayın). Sonra çıkışa göre scp1 veya scp2'yi çalıştırın
Matt

İyi nokta, bunu aklımda tutmaya devam edeceğim ve eğer bir şey bulursam tekrar göndereceğim.
Giles

Sıkı kalabilir misin? sonra a'nın çıkışını kontrol edin cd dir2.
Matt

Yanıtlar:


34

Bu "nokta" sözdizimini kullanın:

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

Bu, dizinin kendisinden ziyade dizinin içeriğini kopyalar. Ve bunun *dünyadan ziyade daha taşınabilir olduğuna inanıyorum .


2
-p ⇒ "Orijinal dosyadaki değişiklik zamanlarını, erişim zamanlarını ve modları korur." -r ⇒ "Dizinleri art arda kopyala." -q ⇒ "İlerleme ölçeri devre dışı bırakır." Kaynak: computerhope.com/unix/scp.htm
kr85

1
Bu bana bir hata veriyor:scp: error: unexpected filename: .
Andrew Koster

1

Normalde, dizin oluşturma işlemini kontrol /etmek için, tam bir yolu ima etmek için bir iz kullanmanız gerekir, ancak bunun mevcut değilse dizini oluşturmakta başarısız olacağını düşünüyorum:

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

Bu aynı zamanda saklı kaçırabilir. * glob genişlemesi nedeniyle dosyalar (bazı zor kabuğa özgü çalışma olmadan )

sshVe ile farklı şekilde yaklaşabilirsiniz tar.

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

Ancak bu, trafiğin yerel makineniz üzerinden geçtiği anlamına gelir.


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

@Giles bunun işe yaradığını mı söylüyorsun?
Matt

1
Tuhaf, ben düzenlemiştim ama kayboldu - hayır, işe yaramazsa, eğer dir yoksa, scp hata verir. Ayrıca bu özel durumda ssh'ım yok (kullanıcı haklarıyla ilgili sorun). Bu bana bir fikir veriyor, bunu bir komut dosyasında yaptığım için yukarıdakileri deneyebilirim, herhangi bir hatayı yakalayabilirim ve yanlışlıkla ilk yazımdan temel sürümü deneyebilirim. Yardım @mindthemonkey için teşekkürler
Giles

1
Hedef dizin benim için olmadığı zaman 'dizin' hatası.
Matt

1
Evet, ben de, dizin olmadığında verilen tuhaf bir hata.
Giles
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.