我正在使用cURL尝试下载某个目录中的所有文件。
这是我的文件列表:
我尝试过使用bash脚本:iiumlabs.[].csv.pgp
和iiumlabs*
,我认为卷曲在通配符上并不大。
curl -u login:pass ftp.myftpsite.com/iiumlabs* -O
问题:如何使用cURL下载此文件目录?
答案 0 :(得分:33)
如果您不必卷曲,可能希望在递归模式下使用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
:递归检索时不要创建目录层次结构。答案 1 :(得分:9)
好的,考虑到您使用的是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要求的密码(仅使用登录名和密码替换login
和pass
,而不使用任何关键字)。然后,使用mget *
获取所有文件。您可以使用任何通配符代替*
。最后,您使用quit
关闭ftp
程序,而无需交互式提示。
如果您需要先输入某个目录,请在cd
之前添加mget
命令。它应该非常简单。
最后,编写该文件并运行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 your-session-name
参数重用使用PuTTy保存的会话。
答案 2 :(得分:3)
这样的事情:
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
答案 3 :(得分: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),在与此文件相同的目录中创建名为downloadedFiles的目录。
答案 4 :(得分: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 = ? 支持带空格的名称
答案 5 :(得分:1)
您可以在Mac上使用以下脚本:
String[] command = {"xdg-open",path}
Process p = Runtime.getRuntime().exec(command);
p.waitFor();