Spraw, aby scp zawsze nadpisywał lub tworzył katalog

26

Korzystam z scp, aby skopiować katalog z jednego zdalnego serwera do nowego katalogu (IE tylko zmienia nazwę) na innym zdalnym serwerze, takim jak:

scp -prq server1:dir1 server2:dir2

Działa to dobrze, jeśli katalog 2 nie istnieje na serwerze 2, tworzy nowy katalog o nazwie katalog 2, który zawiera wszystko od katalogu 1 na serwerze 1.

Problem pojawia się, gdy dir2 już istnieje na serwerze 2 (UWAGA: nie mam możliwości wcześniejszego poinformowania o tym ani zrobienia usunięcia z dir2 na serwerze 2) - co się dzieje, to otrzymuję kopię dir1, zwaną dir1, w dir2.

Jestem pewien, że brakuje mi czegoś podstawowego, ale wydaje mi się, że nie mogę tego rozwiązać.

Każda pomoc bardzo doceniana!

Pozdrowienia,

Giles

Okej, mam mniej niż 10 powtórzeń i nie mogę czekać 8 godzin, więc oto co otrzymałem:

Oto skrypt, który działa dla mnie:

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

Nadal nie jestem pewien, jak to zrobić za pomocą jednego polecenia, a nawet jeśli to możliwe.

Pozdrawiam @mindthemonkey, czasem zdobycie nowego punktu widzenia może pomóc wskazać drogę.

Giles
źródło
masz dostęp do scp, ale nie ssh?
Matt
Zgadza się
Giles
Jedynym problemem jest to, że spróbujesz drugiej kopii przy każdej awarii, która niekoniecznie nie istnieje dir2. Może jeśli potrafisz wymyślić test, który praktycznie nic nie robi (powiedz, skopiuj pusty reż). Następnie na podstawie danych wyjściowych albo uruchom scp1 lub scp2
Matt
Dobra uwaga, będę o tym pamiętać i iść naprzód, jeśli coś wymyślę.
Giles
Umiesz sftp? następnie sprawdź wyjście a cd dir2.
Matt

Odpowiedzi:

34

Użyj tej składni „kropkowej”:

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

Spowoduje to skopiowanie zawartości tego katalogu, a nie samego katalogu. I wierzę, że jest bardziej przenośny niż *globbing.

chronospoon
źródło
2
-p ⇒ „Zachowuje czasy modyfikacji, czasy dostępu i tryby z oryginalnego pliku.” -r ⇒ „Rekurencyjnie kopiuj całe katalogi”. -q ⇒ „Wyłącza miernik postępu.” Źródło: computerhope.com/unix/scp.htm
kr85
1
Daje mi to błąd:scp: error: unexpected filename: .
Andrew Koster
1

Zwykle do kontrolowania tworzenia katalogu należy użyć znaku /końca, aby wskazać pełną ścieżkę, ale myślę, że wówczas nie uda się utworzyć katalogu, jeśli nie istnieje:

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

Może to również brakować ukrytego. pliki z powodu rozszerzenia * glob (bez skomplikowanej pracy powłoki )

Możesz podejść do tego inaczej za pomocą sshi tar.

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

Ale to oznacza, że ​​ruch przechodzi przez lokalną maszynę.

Matt
źródło
scp -prq serwer1: katalog1 / * serwer2: katalog2 /
Giles
@ Giles, mówisz, że to działa?
Matt
1
Dziwne, edytowałem to, ale zgubiłem - nie, to nie działa, jeśli katalog nie istnieje, to scp daje błąd. Również nie mam dostępnego ssh w tym konkretnym przypadku (problem z prawami użytkownika). Daje mi to jednak pewien pomysł, ponieważ robię to w skrypcie, mogę wypróbować powyższe, wychwycić każdy błąd i, w przypadku błędu, wypróbować podstawową wersję z mojego pierwszego postu. Dzięki za pomoc @mindthemonkey
Giles
1
Występuje błąd „Jest katalogiem”, gdy katalog docelowy nie istnieje dla mnie.
Matt
1
Tak, ja też, rodzaj dziwnego błędu, biorąc pod uwagę, że katalog nie istnieje.
Giles