21

我正在使用 cURL 尝试下载某个目录中的所有文件。

这是我的文件列表的样子:

在此处输入图像描述

我曾尝试在 bash 脚本中做:iiumlabs.[].csv.pgp而且iiumlabs*我猜 curl 在通配符上并不大。

curl -u login:pass ftp.myftpsite.com/iiumlabs* -O

问题:我如何使用 cURL 下载这个文件目录?

4

6 回答 6

50

如果您不限于 curl,您可能希望在递归模式下使用wget但将其限制为一级递归,请尝试以下操作;

wget --no-verbose --no-parent --recursive --level=1\
--no-directories --user=login --password=pass ftp://ftp.myftpsite.com/
  • --no-parent:递归检索时永远不要上升到父目录。
  • --level=depth:指定递归最大深度级别深度。默认的最大深度为五层。
  • --no-directories:递归检索时不要创建目录层次结构。
于 2012-08-02T21:03:06.357 回答
13

好的,考虑到您使用的是 Windows,最简单的方法是使用ftp与其捆绑的标准工具。我将以下解决方案基于 Windows XP,希望它在其他版本上也能正常工作(或稍作修改)。

首先,您需要为ftp程序创建一个批处理(脚本)文件,其中包含它的指令。根据需要命名,然后放入:

curl -u login:pass ftp.myftpsite.com/iiumlabs* -O

open ftp.myftpsite.com
login
pass
mget *
quit

第一行打开与 ftp 服务器的连接ftp.myftpsite.com。以下两行指定登录名和 ftp 将要求的密码(仅将 和 替换loginpass登录名和密码,不带任何关键字)。然后,您用于mget *获取所有文件。除了*,您可以使用任何通配符。最后,您可以在没有交互提示quit的情况下关闭程序。ftp

如果您需要先进入某个目录,请cdmget. 它应该很简单。

最后,编写该文件并ftp像这样运行:

ftp -i -s:yourscript

where-i禁用交互性(在下载文件之前询问),并-s指定您创建的脚本的路径。


遗憾的是,Windows 本身不支持通过 SSH 传输文件。但是对于这种情况,您可能还是想使用PuTTy工具。对于这种情况,特别感兴趣的是它实际上是 openssh命令pscp的 PuTTy 对应部分。scp

语法类似于copy命令,它支持通配符:

pscp -batch login@mysshsite.com:iiumlabs* .

如果您使用密钥文件进行身份验证,则应使用-i path-to-key-file. 如果您使用密码,-pw pass. 它还可以使用 load-load your-session-name参数重用使用 PuTTy 保存的会话。

于 2012-08-02T19:18:16.200 回答
7

像这样的东西怎么样:

for /f %%f in ('curl -s -l -u user:pass ftp://ftp.myftpsite.com/') do curl -O -u user:pass ftp://ftp.myftpsite.com/%%f
于 2014-03-20T17:11:03.197 回答
3

您可以在 mac 上使用这样的脚本:

for f in $(curl -s -l -u user:pass ftp://your_ftp_server_ip/folder/) 
 do curl -O -u user:pass ftp://your_ftp_server_ip/folder/$f 
done
于 2018-10-30T13:52:54.607 回答
1

哦,我有你需要的东西!

$host = "ftp://example.com/dir/";
$savePath = "downloadedFiles";
if($check = isFtpUp($host)){

    echo $ip." -is alive<br />";

    $check = trim($check);
    $files = explode("\n",$check);

    foreach($files as $n=>$file){
        $file = trim($file);
        if($file !== "." || $file !== ".."){
            if(!saveFtpFile($file, $host.$file, $savePath)){
                // downloading failed. possible reason: $file is a folder name.
                // echo "Error downloading file.<br />";
            }else{
                echo "File: ".$file." - saved!<br />";
            }
        }else{
            // do nothing
        }
    }
}else{
    echo $ip." - is down.<br />";
}

isFtpUp和功能saveFtpFile如下:

function isFtpUp($host){
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $host);
curl_setopt($ch, CURLOPT_USERPWD, "anonymous:your@email.com");
curl_setopt($ch, CURLOPT_FTPLISTONLY, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);

$result = curl_exec($ch);

return $result;

}

function saveFtpFile( $targetFile = null, $sourceFile = null, $savePath){

// function settings
set_time_limit(60);
$timeout = 60;
$ftpuser = "anonymous";
$ftppassword = "your@email.com";
$savePath = "downloadedFiles"; // should exist!
$curl = curl_init();
$file = @fopen ($savePath.'/'.$targetFile, 'w');

if(!$file){
    return false;
}

curl_setopt($curl, CURLOPT_URL, $sourceFile);
curl_setopt($curl, CURLOPT_USERPWD, $ftpuser.':'.$ftppassword);

// curl settings

// curl_setopt($curl, CURLOPT_FAILONERROR, 1);
// curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
curl_setopt($curl, CURLOPT_FILE, $file);

$result = curl_exec($curl);


if(!$result){
    return false;
}

curl_close($curl);
fclose($file);

return $result;
}

编辑:

这是一个 php 脚本。将其保存为 .php 文件,将其放在您的网络服务器上,将 $ip 更改为您要从中下载文件的 ftp 服务器的地址(不必是 ip),在与该文件相同的目录中创建一个名为 downloadFiles 的目录。

于 2012-08-02T18:23:10.807 回答
1

以下是我使用 cURL 快速下载的方法(但我不确定它可以下载多少文件):

setlocal EnableDelayedExpansion

cd where\to\download

set STR=
for /f "skip=2 delims=" %%F in ('P:\curl -l -u user:password ftp://ftp.example.com/directory/anotherone/') do set STR=-O "ftp://ftp.example.com/directory/anotherone/%%F" !STR!
path\to\curl.exe -v -u user:password !STR!

为什么跳过=2?搭便车._..

为什么delims=?支持带空格的名称

于 2014-08-30T06:34:38.277 回答