Jak skopiować tylko nowe pliki za pomocą polecenia „scp”?

24

Kopiowałem setki plików na inny komputer, używając scppolecenia, w którym dostałem stalled błąd . Teraz zamierzam ponownie skopiować pliki. Czy jest jakiś sposób, aby uniknąć kopiowania już skopiowanych plików?

Meysam
źródło

Odpowiedzi:

40

Możesz do tego użyć rsync. rsyncjest naprawdę zaprojektowany do tego typu operacji.

Składnia:

rsync -avh /source/path/ host:/destination/path

lub

rsync -a --ignore-existing /local/directory/ host:/remote/directory/

Kiedy uruchomisz go po raz pierwszy, skopiuje całą zawartość, a następnie skopiuje tylko nowe pliki.

Jeśli musisz tunelować ruch przez połączenie SSH (na przykład w celu zachowania poufności), jak wskazano pierwotnie, prosząc o rozwiązanie oparte na SCP, po prostu dodaj -e sshdo parametrów rsync. Na przykład:

rsync -avh -e ssh /source/path/ host:/destination/path
CVn
źródło
Czy --ignore-existingnaprawdę jest wymagany?
Meysam,
Ponieważ w tym przykładzie instrukcji: rsync -t *.c foo:src/-> "To przeniesie wszystkie pliki pasujące do wzorca * .c z bieżącego katalogu do katalogu src na komputerze foo. Jeśli którykolwiek z plików już istnieje w systemie zdalnym, to rsync remote- protokół aktualizacji służy do aktualizacji pliku, wysyłając tylko różnice
Meysam,
1
Zwykle używam rsync -avuzh /source/path/ host:/destination/path. Wykonuje całą pracę w jednym poleceniu, a przy kolejnych wywołaniach przesyła tylko pliki, które tego potrzebują.
Edward Falk
6

Jeśli chcesz trzymać się SCP z jakiegokolwiek powodu, można usunąć w uprawnieniach na lokalnym danych (jeśli masz prawo to zrobić) i SCP nie będzie go dotknąć. Być bardziej dokładnym:

  1. chmod a-w local/*.tar.gz (w twoim lokalnym reż.)
  2. scp remote/*.tar.gz local

Nie jest to zbyt wydajne, miłe, ale może pomóc, jeśli potrzebujesz szybkiego tymczasowego rozwiązania bez zmiany na coś innego niż scp. (Kudos: scp bez zastępowania istniejących plików w miejscu docelowym )

Xhudik
źródło
Naprawdę podoba mi się to rozwiązanie. Zbieram pliki ze zdalnych czujników do archiwum. Całe działające katalogi - każdy ma podkatalog Archiwum. Gdy pliki przejdą do archiwum, nigdy nie zostaną zmienione. Naprawdę łatwo byłoby oznaczyć zarchiwizowane pliki jako -w, więc to właśnie zrobię. A działające pliki poza katalogami archiwum można pozostawić bez zmian, więc jeśli uruchomię program aktualizacyjny w ciągu dnia, nadal będą kopiować pliki w toku. Właśnie tego szukałem. TNX dużo!
SDsolar
4

Nie było dokładnej odpowiedzi, jak to zrobić za pomocą SCP, ponieważ takie było pierwotne pytanie.

sudo find /files/ -type f -exec chmod a-w {} \;

scp -r [email protected]:/file/location/* /files

Po zakończeniu kopiowania plików zmień uprawnienia z powrotem:

sudo chmod a+w -R /files

Stóg
źródło
1
Prawdopodobnie pierwotne pytanie brzmiało: „jak mogę rozwiązać ten problem”, na co rsync jest odpowiedzią.
Edward Falk