Мне интересно, если это возможно для get
файлов с sftp
, но предотвратить повторную загрузку файлов, которые уже существуют в папке назначения?
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.
Вы можете использовать -a
флаг для get
команды:
$ sftp example.com
sftp> get -a hello.txt
Вы можете указать, *
чтобы скачать весь каталог, конечно.
Однако есть несколько предостережений.
Лучшим вариантом будет использовать rsync
:
rsync example.com:hello.txt
Это всегда даст вам файл в том виде, в котором он находится на сервере, передавая только различия между локальной и удаленной копиями, если они различаются, и он доступен повсеместно.