我想知道是否可以使用 来get
下载文件sftp
,但阻止它重新下载目标文件夹中已存在的文件?
答案1
sftp
能力有限。尽管如此,该get
命令有一个选项可以解决这个问题:get -a
完成部分下载,因此如果客户端上已存在文件并且至少与服务器上的文件一样大,则不会下载该文件。如果文件存在但较短,则将传输文件的末尾,如果本地文件是中断下载的产物,则这是有意义的。
通过 SFTP 执行复杂操作的最简单方法是使用SSHFS。 SSHFS 是一种使用 SFTP 使远程文件系统显示为本地文件系统的文件系统。在客户端,SSHFS 需要保险丝,在大多数现代 unice 上都可用。在服务器上,SSHFS需要SFTP;如果服务器允许 SFTP,那么您可以使用 SSHFS。
mkdir server
sshfs server.example.com:/ server
rsync -a server/remote/path /local/path/
fusermount -u server
请注意,通过 SSHFS 进行的 rsync 无法利用增量传输算法,因为它无法计算远程端的部分校验和。这对于一次性下载来说无关紧要,但如果您要同步已修改的文件,那就太浪费了。为了有效同步修改的文件,请使用rsync -a server:/remote/path /local/path/
,但这需要 SSH shell 访问,而不仅仅是 SFTP 访问。不过,shell 访问可以限制为 rsync 命令。
答案2
您可以将-a
标志用于该get
命令:
$ sftp example.com
sftp> get -a hello.txt
当然,您可以指定*
下载整个目录。
但是,有一些注意事项。
- 这在 OS X 上不起作用。它可能在其他系统上不起作用。我在 Ubuntu 15.04 上测试过。
- 该选项旨在恢复中断的下载。如果您的文件已更改,结果将是下载损坏。
更好的选择是使用rsync
:
rsync example.com:hello.txt
这将始终为您提供服务器上的文件,仅传输本地副本和远程副本之间的差异(如果它们不同),并且它是普遍可用的。