sftp - jak kopiować tylko pliki z folderu, który nie istnieje w folderze docelowym

19

Zastanawiam się, czy można getza pomocą plików sftp, ale uniemożliwisz ponowne pobieranie plików, które już istnieją w folderze docelowym?

anthonybell
źródło

Odpowiedzi:

20

sftpma ograniczone możliwości. Niemniej jednak getpolecenie ma opcję, która może załatwić sprawę: get -awykonuje częściowe pobieranie, więc jeśli plik jest już obecny na kliencie i jest co najmniej tak duży, jak plik na serwerze, nie zostanie pobrany. Jeśli plik jest obecny, ale krótszy, koniec pliku zostanie przesłany, co ma sens, jeśli plik lokalny jest produktem przerwanego pobierania.

Najłatwiejszym sposobem wykonywania skomplikowanych czynności za pomocą SFTP jest użycie SSHFS . SSHFS to system plików, który używa SFTP, aby zdalny system plików pojawiał się jako lokalny system plików. Na kliencie, SSHFS wymaga BEZPIECZNIKA , który jest dostępny w większości nowoczesnych jednorożców. Na serwerze SSHFS wymaga SFTP; jeśli serwer zezwala na SFTP, możesz użyć SSHFS.

mkdir server
sshfs server.example.com:/ server
rsync -a server/remote/path /local/path/
fusermount -u server

Zauważ, że rsync przez SSHFS nie może skorzystać z algorytmu transferu delta, ponieważ nie jest w stanie obliczyć częściowych sum kontrolnych po stronie zdalnej. Nie ma to znaczenia przy jednorazowym pobieraniu, ale marnuje się, jeśli synchronizujesz zmodyfikowane pliki. Użyj wydajnej synchronizacji zmodyfikowanych plików, rsync -a server:/remote/path /local/path/ale wymaga to dostępu do powłoki SSH, a nie tylko dostępu SFTP. Dostęp do powłoki można jednak ograniczyć do komendy rsync.

Gilles „SO- przestań być zły”
źródło
7

Możesz użyć -aflagi dla getpolecenia:

$ sftp example.com
sftp> get -a hello.txt

Możesz *oczywiście pobrać cały katalog.

Istnieje jednak kilka zastrzeżeń.

  • To nie działa w systemie OS X. Może nie działać w innych systemach. Przetestowałem to na Ubuntu 15.04.
  • Ta opcja ma wznowić przerwane pobieranie. Jeśli plik się zmienił, wynik może być uszkodzony.

Lepszą opcją byłoby użycie rsync:

rsync example.com:hello.txt

To zawsze da ci plik taki, jaki jest na serwerze, przenosząc różnice tylko między lokalną a zdalną kopią, jeśli się różnią, i jest to powszechnie dostępne.

Stefano Palazzo
źródło