我需要从客户端的 FTP 下载 10,000 个 zip 文件,其中大约有 40,000 个项目。我考虑过这样做:
$ cat > files.txt
file1
file2
file3
file4
和
$ wget -i files.txt
万一我超时了,有没有更好的解决方案来处理这么大的问题?
答案1
该解决方案很好并且非常可靠:使用适当的选项,wget
将重试并下载任何传输中断的文件。
但是,您也可以编写大多数命令行 FTP 客户端脚本(例如 BSD ftp 客户端)。但wget
更好的是,您可以将其配置为不下载您已有的文件,这使得同步非常方便。
wget
支持(至少在 Linux 上)速率限制,并且可以很容易地将文件列表分发到多个文件之间以便并行下载,或者您可以使用GNU并行。
答案2
wget
很好,很称职,而且正如 Iserni 的回答所说,如果您深入研究手册以查找可用选项,在这种情况下可能会很好地工作。我只会陈述一些替代方案。
我用低速FTP用于通过 FTP 和 SFTP 进行传输和同步。它有一个内部排队系统,非常适合我的用例,支持镜像、反向镜像、FXP、所有常规 FTP 功能等(现在甚至支持 Bittorrent)。
在这种情况下,只需使用脚本和就足够简单了wget
,但我想提一下一个可以大大简化 FTP 传输的程序。
我也用过FTP服务器它有一个非常好的批处理系统,但对我来说,LFTP 最大的优势在于它同时支持 FTP 和 SFTP。
另一种选择是rsync
它还支持 FTP,也许您已经习惯了。它还提供了相当高级的选项,例如过滤和恢复中断的下载。
与批量使用相比,“真正的”FTP 客户端的一个优点wget
是可以重复使用与服务器的单个连接,这可能会提高性能。我不确定是否有这样的替代方案wget
,但也许有。如果这是真正的一次性操作,您可能可以使用或多或少任何东西。
答案3
lftp 在这方面表现不错。注意继续和扩展通配符选择。
lftp :~> 帮助镜像 用法:镜像 [OPTS] [远程 [本地]] 镜像指定远程目录到本地目录-c, --continue 如果可能的话继续镜像作业 -e, --delete 删除远程站点不存在的文件 --delete-first 在传输新文件之前删除旧文件 -s, --allow-suid 根据远程站点设置 suid/sgid 位 --allow-chown 尝试设置文件的所有者和组 --ignore-time 在决定是否下载时忽略时间 -n, --only-newer 仅下载较新的文件(-c 不起作用) -r, --no-recursion 不进入子目录 -p, --no-perms 不设置文件权限 --no-umask 不对文件模式应用 umask -R, --reverse 反向镜像(放置文件) -L, --dereference 将符号链接下载为文件 -N, --newer-than=SPEC 仅下载比指定时间更新的文件 -P, --parallel[=N] 并行下载 N 个文件 -i RX, --include RX 包含匹配的文件 -x RX, --exclude RX 排除匹配的文件 RX 是扩展正则表达式 -v, --verbose[=N] 详细操作 --log=FILE 将正在执行的 lftp 命令写入文件 --script=FILE 将 lftp 命令写入 FILE,但不执行它们 --just-print, --dry-run 与 --script=- 相同
当使用 -R 时,第一个目录是本地的,第二个目录是远程的。 如果省略第二个目录,则使用第一个目录的基本名称。 如果省略两个目录,则使用当前本地和远程目录。
lftp:~> 帮助 mget 用法:mget [OPTS] 使用扩展通配符获取选定的文件 -c 继续,重新获取 -d 创建与文件名相同的目录并获取 文件放入其中而不是当前目录中 -E 传输成功后删除远程文件 -a 使用 ascii 模式(默认为二进制) -O 指定放置文件的基本目录或 URL