sftp - как копировать файлы только из папки, которой нет в папке назначения

19

Мне интересно, если это возможно для getфайлов с sftp, но предотвратить повторную загрузку файлов, которые уже существуют в папке назначения?

anthonybell
источник

Ответы:

20

sftpимеет ограниченные возможности. Тем не менее, getкоманда имеет опцию, которая может сделать хитрость: get -aзавершить частичную загрузку, поэтому, если файл уже присутствует на клиенте и по крайней мере имеет размер файла на сервере, он не будет загружен. Если файл присутствует, но короче, будет передан конец файла, что имеет смысл, если локальный файл является продуктом прерванной загрузки.

Самый простой способ сделать сложные вещи через SFTP - это использовать SSHFS . SSHFS - это файловая система, использующая SFTP для отображения удаленной файловой системы в качестве локальной файловой системы. На клиенте SSHFS требует FUSE , который доступен в большинстве современных устройств. На сервере SSHFS требуется SFTP; если сервер разрешает SFTP, тогда вы можете использовать SSHFS.

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

Обратите внимание, что rsync поверх SSHFS не может использовать преимущества алгоритма дельта-передачи, потому что он не может вычислить частичные контрольные суммы на удаленной стороне. Это не имеет значения для одноразовой загрузки, но расточительно, если вы синхронизируете файлы, которые были изменены. Для эффективной синхронизации измененных файлов используйте rsync -a server:/remote/path /local/path/, но для этого требуется доступ к оболочке SSH, а не только доступ SFTP. Доступ к оболочке может быть ограничен командой rsync.

Жиль "ТАК - перестань быть злым"
источник
7

Вы можете использовать -aфлаг для getкоманды:

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

Вы можете указать, *чтобы скачать весь каталог, конечно.

Однако есть несколько предостережений.

  • Это не работает в OS X. Это может не работать в других системах. Я тестировал его на Ubuntu 15.04.
  • Опция предназначена для возобновления прерванных загрузок. Если ваш файл изменился, результатом будет поврежденная загрузка.

Лучшим вариантом будет использовать rsync:

rsync example.com:hello.txt

Это всегда даст вам файл в том виде, в котором он находится на сервере, передавая только различия между локальной и удаленной копиями, если они различаются, и он доступен повсеместно.

Стефано Палаццо
источник