如何在Linux上通过FTP递归下载文件夹


325

我正在尝试使用命令行ftp客户端对ftp文件夹进行ftp,但是到目前为止,我只能使用'get'来获取单个文件。


5
正确的答案是来自lkuty的11年4月6日14:13。不要使用mget,它根本不是递归的。来自08年9月22日9:01的答案蒂博特·巴雷尔(ThibautBarrère)更容易理解,但必须添加-l 0评论中提到的选项
chriscatfr 2012年

Answers:


634

您可以依靠通常可以正确处理ftp的wget(至少以我自己的经验)。例如:

wget -r ftp://user:pass@server.com/

您也可以使用-m适合镜像的。目前等同于-r -N -l inf

如果凭据详细信息中包含一些特殊字符,则可以指定--user--password参数使其生效。具有特定字符的自定义登录的示例:

wget -r --user="user@login" --password="Pa$$wo|^D" ftp://server.com/

编辑 @asmaier指出,请注意,即使-r是递归,它的默认最大级别也为5:

       -r
       --recursive
           Turn on recursive retrieving.

       -l depth
       --level=depth
           Specify recursion maximum depth level depth.  The default maximum depth is 5.

如果您不想错过子目录,最好使用镜像选项-m

       -m
       --mirror
           Turn on options suitable for mirroring.  This option turns on recursion and time-stamping, sets infinite
           recursion depth and keeps FTP directory listings.  It is currently equivalent to -r -N -l inf
           --no-remove-listing.

121
更好地使用wget -m--mirror)。wget -r默认情况下限制为5的递归深度。
asmaier 2011年

13
我不得不使用--user--password太在Red Hat。我的wget是:GNU Wget 1.11.4 Red Hat modified我想知道它是版本还是发行版……
devin 2012年

61
您可以使用设置无限递归级别-l 0,因此无需使用--mirror它可能会有一些有害的副作用,例如.listing文件
Hnatt 2012年

28
我用wget --ask-password -rl 99 ftp://user@server.com。这样,密码对于便不可见,ps也不保留在历史记录中。当然,根据ftp的性质,它以未加密的形式发送到服务器。
Walter Tross 2013年

7
提醒bash newbs:如果您的用户名或密码具有控制字符(例如$),则必须使用单引号,例如--user='user' --password='pa$$word'
tobek

164

只是为了补充ThibautBarrère给出的答案。

我用了

wget -r -nH --cut-dirs=5 -nc ftp://user:pass@server//absolute/path/to/directory

请注意服务器名称后的双斜杠。如果我不加斜杠,则路径相对于用户的主目录。

  • -nH避免创建以服务器名称命名的目录
  • -nc避免在目标文件上已经存在的情况下创建一个新文件(只是跳过了文件)
  • --cut-dirs = 5允许我获取/ absolute / path / to /目录的内容,并将其放在启动wget的目录中。数字5用于过滤路径的5个组成部分。双斜杠表示多余的部分。

3
辉煌。跳过已经存在的文件的功能非常适合赶上服务器迁移中的最新添加。rsync效率更高且更灵活,但是有时该选项不可用,并且只能使用FTP。
杰森

这里的参数很好,特别是-nc和--cut-dirs。感谢分享!
Lance Cleveland

2
我并不总是信任“跳过现有文件”,因为其中一个可能不完整或大小和内容不同,但我很好地提到了该选项
Daniel W.

即使在今天,当无法使用rsync时,我仍然使用此wget命令。-nc和--cut-dirs非常有用!
2015年

4
太棒了!而且,如果您不想在命令行上输入密码,可以使用--ftp-user=USER--ask-password
shoover

25
ncftp -u <user> -p <pass> <server>
ncftp> mget directory

我无法使用params登录到FTP服务器,但是open ftp://USERNAME:PASSWORD@HOST在启动ncftp之后使用了结构…
Feeela 2011年

+1-我知道这篇文章很旧,但是我刚发现它,并且ncftp确实很容易使用。我用-R与ncftpget递归让
扎克·麦康伯

绝对比wgetTAR模式更可靠,并且在TAR模式下也更快。谢谢!
lencinhaus

3
如Ubuntu 14.04所述,这不起作用。对我有用的语法是“ get -R directory”而不是mget。
伊万

在Ubuntu 14.04上为我工作。我不必担心这一切都在那里。
ashley


17

如果您可以使用scp代替ftp,则该-r选项将为您完成此操作。我将检查是否可以使用比FTP更现代的文件传输机制。


2
我之所以投票赞成这是因为这确实是我的第一个想法,即使它不能严格按照原样回答问题。
metao

您建议@ greg-hewgill哪一个?我有类似的问题
Michal Gonda

1
scp仍会尝试使用ssh,如果您只有FTP凭据,该方法将无效。感到奇怪的是,我在2008年的评论中说,我坚持使用的技术不是现代技术:(很好的2008年,您发表评论的那天我18岁
。– aexl


7

有“ ncftp”可用于在Linux中安装。这适用于FTP协议,可用于递归下载文件和文件夹。在linux上工作。已被使用,并且在递归文件夹/文件传输中正常工作。

检查此链接... http://www.ncftp.com/


2
在Windows上的ncftp的工作,以及
伊利亚

我爱ncftp!谢谢。
jocull 2012年

3

如果可以的话,我强烈建议您tarbzip(或gzip随便什么)远程计算机上的目录-对于任何大小的目录,节省带宽可能值得花时间进行zip / unzip。


也许是在2008年,但是在2013年,带宽不再重要,您可能拥有FTP但没有控制台访问权限:-)
Daniel W.

3

如果要坚持使用命令行FTP,则应尝试使用NcFTP。然后,您可以使用get -R递归获取文件夹。您还将获得完成。



1

您不应该使用ftp。就像telnet它没有使用安全协议一样,密码以明文形式传输。这使第三方很容易捕获您的用户名和密码。

要远程复制远程目录,这些选项更好:

  • rsync如果您可以通过进行登录ssh,则它是最合适的工具,因为它仅复制差异,并且可以很容易地在中间重新启动以防连接中断。

  • ssh -r 是递归复制目录结构的第二好的选择。

看到:


不安全,仅ftp
JosFabre

现在是2015年。不应使用FTP。
蒂洛

1
我同意。并且应该始终提出提高安全性的建议。但是问题是关于FTP的,因此说不应该使用它
无济于事

我谨不同意。他们使用了错误的工具来完成工作。他们应该学会使用安全的最新工具,而不是1980年代的ftp。更具体地说,没有人应该再运行ftp服务器了:P
Tilo

4
抱歉,上周我正在访问仅具有FTP连接的服务器。我的任务是迁移不是这样。
Antti Haapala'3

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.