使用sftp传输目录?


50

当我尝试使用sftp传输包含文件的目录时,出现错误消息:

skipping non-regular file directory_name

该目录包含几个文件和两个子目录。

我究竟做错了什么?

Answers:


48

sftpcp和一样scp,要求您在复制文件夹(显然是文件夹及其内容)时,必须明确告知要使用该-r选项递归传输文件夹。

因此,添加-r到命令。


2
-r后放置put命令?如果我收到了“ put:Invalid flag -r”错误消息,则会收到一条消息。将其添加到原始sftp命令中也不起作用。
haziz 2011年

5
连接时添加-rsftp命令。 sftp -r user@host
凯文

1
@Kevin我收到以下错误“ sftp:未知选项--r”
Amatya 2014年

2
请注意,OpenSSH的SFTP 中存在一个长期存在的错误:以递归方式将目录复制到远程服务器时,该目录本身必须已经存在于目标服务器上,否则传输将失败,并显示一条非明确的错误消息:Couldn't canonicalise: No such file or directory
WhiteWinterWolf 2015年

5
应该是这样的:# sftp user@remote-host #> get -r remote-folder
hbinduni

20

我只能建议您使用rsync。通过安全连接移动文件时,这在某种程度上是行业标准。

rsync -alPvz ./source_dir server.com:destination_dir

到目前为止,这是我多年来一直在使用的。

(该-a选项负责目录递归操作)


3
关于所提到的参数的一些澄清:-a=递归+保留符号链接,权限,修改时间,所有者,组,特殊文件和设备文件(后者需要超级用户特权);-l=保持符号链接(已包含在中-a);-P=显示传输过程中的进度+保留部分传输的文件;-v=详细模式(但是,-P为了避免出现奇怪的(错误?)protocol version mismatch错误,它似乎是强制性的);-z=启用压缩传输的数据。
WhiteWinterWolf 2015年

@WhiteWinterWolf是否-l必须使用此开关似乎与版本有关。我记得较早的版本未包含-l在中-a
polemon

5

您也许还可以使用use scp。通用格式为

scp -rp sourceDirName username@server:destDirName

scp表示“安全副本”。标志是

  • -r 递归到子目录
  • -p 保留修改时间

我相信其余项目都是不言自明的


和scp -rp -P <端口> ....使用非标准端口时
-Pancho

4

这对我有用:

1)通过连接sftp到远程主机

2)切换到您要复制的远程目录。(例如:cd音乐)

3)更改为您要将内容复制到的本地目录。(例如:液晶台式机)

4)发出以下命令: get -r *


4

如果rsync不是一种选择,我接下来将建议lftp

lftp sftp://user@host.com/path/path/

然后使用该mirror命令以递归方式上传,如下所示:

mirror -R

(请注意,递归是默认的,-R相反的 -使镜命令的上传,而不是下载尝试添加。--dry-run做一个试验,以确保它在做什么你所期望的。)

或上传而无需递归:

mirror --no-recursion

您必须cd进入要镜像的目录。很棒!


2

如果可以,请使用sshfs。这是一个FUSE文件系统,可在大多数现代的Unice上使用,并且可与任何SFTP服务器一起使用。这是一个远程文件系统:它使您可以使用常规实用程序来操作远程文件(通过SFTP协议)。

mkdir /mount/point
sshfs server.example.com:/remote/path /mount/point
ls /mount/point
cp -Rp /mount/point/somedir /local/location
fusemount -d /mount/point

0

这有点矛盾,但对我有用的是:

  1. 使用ssh登录到远程机器
  2. 使用sftp从远程计算机到本地机器
  3. 然后,使用get带有该-r选项的命令来移动目录及其所有文件。

1
不要与-r一起使用sftp> get -r data /opt/bin get: Invalid flag -r
天网

0

如果您的问题实际上是“如何使用sftp传输目录”,那么

 sftp -r user@server

但是,如果您转移目录,我可能会根据您的需求建议两个更好的选择。 sftp需要在类似ssh的命令提示符下登录到远程服务器,但是如果只需要文件,则可以使用更简便快捷的方法。

Scp

对于一次传输,要上传,请尝试:

 # upload source directory to remote server
 scp -rp source_dir user@server:dest

 #download directory from remote server:
 scp -rp user@server:source_dir dest

 #specifying ssh key:
 scp -rp -i ~/.ssh/key user@server:source_dir dest

 #remote directory has spaces
 scp -rp -i ~/.ssh/key user@server:"source\\ dir" dest

同步

如果计划定期同步目录,则使用rsync更有意义。它在两个目录之间执行增量操作,从而节省了传输时间和在线数据。

rsync -r -a -v -e ssh --delete source_dir user@server:dest

以下是一些最常见的rsync选项的列表:(摘自此处

  • --delete-删除发件人(系统)上不存在的文件
  • -v-详细(-vv将提供更多详细信息)
  • -e“ ssh选项”-将ssh指定为远程shell
  • -a-存档模式-它保留权限(所有者,组),时间,符号链接和设备
  • -r-递归到目录
  • -z-传输期间压缩文件数据
  • --exclude'foldername'–从传输中排除相应的文件夹
  • -P –显示传输过程中的进度

希望有帮助!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.