shell 下载带有cURL的目录中的所有文件

fquxozlt  于 2023-03-19  发布在  Shell
关注(0)|答案(7)|浏览(350)

我正在使用cURL尝试下载某个目录中的所有文件。
这是我的文件列表看起来像:

我试着在bash脚本中做:iiumlabs.[].csv.pgpiiumlabs*,我猜curl在通配符中并不重要。

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

**问题:**如何使用cURL下载此文件目录?

wfauudbj

wfauudbj1#

如果您没有绑定curl,您可能希望在递归模式下使用wget,但将其限制在一个递归级别,请尝试以下操作;

wget --no-verbose --no-parent --recursive --level=1 \
--no-directories --user=login --password=pass ftp://ftp.myftpsite.com/
  • --no-parent:在递归检索时,永远不要上升到父目录。
  • --level=depth:指定递归最大深度级别depth。默认最大深度为五层。
  • --no-directories:递归检索时不创建目录层次结构。
  • --delete-after:如果下载后需要删除文件,可以添加。
  • --no-host-directories:要正确下载到当前文件夹.“”中,不创建按域命名的目录。
  • --no-clobber:跳过将下载到现有文件的下载
  • --continue:继续获取部分下载的文件以提高稳定性
  • cd合并:定义目标目录

因此,此示例如下所示:

cd /home/destination/folder \
&& wget --no-verbose --no-parent --recursive --level=1 \
--no-directories --no-host-directories \
--no-clobber --continue \ 
--user=login --password=pass ftp://ftp.myftpsite.com/
v7pvogib

v7pvogib2#

好的,考虑到您使用的是Windows,最简单的方法是使用它捆绑的标准ftp工具。我基于Windows XP提出了以下解决方案,希望它在其他版本上也能工作(或稍作修改)。
首先,你需要为ftp程序创建一个批处理(脚本)文件,包含它的指令。根据你的需要命名它,并放入:

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

open ftp.myftpsite.com
login
pass
mget *
quit

第一行打开到ftp.myftpsite.com的ftp服务器的连接。下面两行指定ftp将要求的登录名和密码(只使用登录名和密码替换loginpass,不使用任何关键字)。然后,使用mget *获取所有文件。可以使用任何通配符来代替*。最后,你使用quit来关闭ftp程序而没有交互提示。
如果需要先输入某个目录,可以在mget之前添加一个cd命令,这应该非常简单。
最后,编写该文件并运行ftp,如下所示:

ftp -i -s:yourscript

其中-i禁用交互性(下载文件前询问),-s指定创建的脚本的路径。
遗憾的是,Windows本身并不支持通过SSH传输文件,但在这种情况下,你可能还是想使用PuTTy工具,在这种情况下,特别感兴趣的是pscp,它实际上是openssh scp命令的PuTTy对应部分。
语法类似于copy命令,并且支持通配符:

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

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

izkcnapc

izkcnapc3#

不如这样:

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
6tqwzwtp

6tqwzwtp4#

你可以在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
tzdcorbm

tzdcorbm5#

噢,我正好有你需要的东西!

$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 />";
}

并且函数isFtpUpsaveFtpFile如下:

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文件,把它放在你的web服务器上,改变$ip到你想要下载文件的ftp服务器的地址(不需要是ip),创建一个名为downloadedFiles的目录在相同的目录作为这个文件.

v64noz0r

v64noz0r6#

下面是我如何用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?为了乘坐...
为什么分隔符=?支持名称中包含空格

a2mppw5e

a2mppw5e7#

如果您没有绑定到curl,则可能希望使用lftp,请尝试以下操作:

lftp ftp://ftp.some.domain.com -u login@some.domain.com,'password' -e 'set ftp:ssl-allow no; mirror --Remove-source-files --verbose /remote/directory /home/destination/folder; bye'

地点

  • 用户名:
  • ,'password':将密码放在配额中
  • --Remove-source-files:删除下载后的文件
  • --verbose:很高兴看到信息,但在生产时可以随意删除
  • set ftp:ssl-allow no;:仅在不需要检查证书(非ssl)的情况下

相关问题