使用wget递归下载整个FTP目录


93

我想将所有文件和文件夹从一台主机复制到另一台主机。旧主机上的文件位于/ var / www / html,我只能通过FTP访问该服务器,而我无法TAR所有文件。通过FTP到旧主机的定期连接将我带到/ home / admin文件夹。

我尝试在新服务器上运行以下命令:

wget -r ftp://username:password@ip.of.old.host

但是我得到的只是一个编成的index.html文件。

通过FTP递归使用wget的正确语法是什么?


2
请注意,默认情况下,wget -r的最大递归深度为5;默认值为0。如果您有更深的子目录,除非您更改此子目录,否则它们将被忽略(请参见手册页中的-l)。
mikewaters 2011年

Answers:


125

尝试-m--mirror

wget -m ftp://username:password@ip.of.old.host

15
出于安全原因,最好使用--ask-password避免将密码保留在中history
校验和

太酷了 工作就像一个魅力..
Sambhav夏尔马

这应该是公认的答案(以提高可见性)。
令人讨厌的

它不包含要下载的目录的路径,我猜@Formoda的答案更好
Wasim

@WasimA。,您也可以在此处添加目录路径:wget -m ftp://username:password@ip.of.old.host/mydir/
Alex Che

37

您说对了,最后只需要在结尾加上*:

wget -r ftp://username:password@1.2.3.4/dir/*

对于共享服务器,可以这样使用:

wget -r ftp://1.2.3.4/dir/* --ftp-user=username --ftp-password=password

由于大多数共享服务器都具有ftp-username之类的名称,例如username @ hostname,因此,第一个wget命令不起作用,第二个命令可以正常工作。


1
这样只会深入一个目录。最好使用-m标志
SvennD

在某些情况下,由于空间不足,第二个命令不起作用,您可以使用第一个命令进行共享托管。** wget -r ftp:/ /用户名%40host:password @ host / dir / **
Wasim

注意:您应该使用-m或, -r -l inf因为-r的默认递归深度为5。请参阅gnu.org/software/wget/manual/…–
ndemou

7

除了wget,您还可以在脚本模式下使用lftp。以下命令会将给定的远程FTP目录的内容镜像到给定的本地目录,并将其放入cron作业中:

lftp -c 'open <hostname>; user <username> <password>; mirror -e <remote-src-path> <local-dest-path>; quit'

它自动处理递归到目录中,并允许指定远程源起始目录从来下载数据。


5

您可以使用“ curlftpfs-将ftp主机作为本地目录挂载”,一旦挂载,就可以使用“ cp -r”等普通文件工具。


curlftpfs除非您将其降级,否则现在就存在主要的性能问题libcurl3-gnutls
横街2015年

5

检查以下wget命令以递归方式从FTP下载数据。

wget --user="<user-name>" --password="<password>" -r -np -nH --cut-dirs=1 --reject "index.html*" "<URL to download files>"

-r:用于递归下载。

-np:不适合任何父母升序。

-nH:用于禁止创建名称与URL相同的目录,即abc.xyz.com

--cut-dirs:用于忽略父目录的数量。对于您的命令,此选项的值将有所不同。

您可以通过执行以上命令进行检查。



2

应该可以尝试:

wget -r ftp://ftp:ftp@ftp.sunet.se/tst/

2

采用:

wget -m ftp://192.168.0.1

它将镜像所有文件和文件夹。


就像我说的那样,通过FTP登录会将我带到/ home / admin文件夹,并且我需要的文件位于/ var / www / html中,所以当我运行您建议的命令时,我只会得到/ home / admin的内容我尝试使用192.168.0.1/var/www/html来运行它,但是随后尝试将其更改为CWD / home / admin / var / www / html。如何使其从根目录转到该文件夹​​?

我没有这个特定问题的经验,但是您可以尝试在您家的下方建立一个符号链接到/ var / www / html。然后,您可以使用192.168.0.1/html之
储存

我尝试创建符号链接,但是wget在本地创建了类似的符号链接。

1

那是正确的语法。不知道为什么您没有得到预期的结果。

与以往一样,有多种方法可以做到这一点。尝试ncftp,尤其是ncftpget


我无法在新服务器上安装更多软件。我不应该告诉wget从/ var / www / html下载所有文件吗?我尝试了wget -r username:password@ip.of.old.host/var/www/html,但是我发现目录未找到错误。

1

我能理解您是否尝试将其转储到cron或其他内容中,但是为什么不使用普通的客户端和mget *简单地将其ftp到服务器中呢?这可能是一条更快的成功之路。


我尝试过mget *,但不适用于子文件夹,因为它说本地子文件夹不存在。有没有办法让他自动创建本地文件夹?

根据您的客户端,-r开关通常可以解决问题。IE:mget -r *
pooter博士

嗯 Linux中的AFAIK标准ftp客户端并非旨在递归检索目录。我的意思是-没有-r选项。其他客户端(例如ncftp或lftp)支持递归检索,但默认情况下通常不可用。
斯坦,

1

如我所说,通过FTP登录会将我带到/ home / admin文件夹,并且我需要的文件在/ var / www / html中

我认为这将适合您的情况:

wget -r ftp://192.168.0.1/../../var/www/html

0

我遇到Windows托管用户名为brinkster / username的情况,因此,如果使用以下语法,wget将引发错误:

wget -m ftp://brinkster/username:password@ip.of.the.host

为了克服这个问题,请使用

wget -m ftp://brinkster%2Fusername:password@ip.of.old.host

我不得不面对Windows托管@ brinkster。


-3

wget --user username --password yourpassword ftp://example.com/ftpfiles/filename 将执行此操作,或者您可以添加*而不是文件名entring:使wget想到在您的情况下无效的端口。


这个对已有四年历史的问题的答案带有多个被投票的答案,并没有提供任何新的内容,甚至没有提供递归副本的要求。
Sven
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.