CURLを使用して、特定のディレクトリ内のすべてのファイルをダウンロードしようとしています。
ファイルのリストは次のようになります。
私はbashスクリプトでやろうとしました:iiumlabs.[].csv.pgp
およびiiumlabs*
そして、ワイルドカードではカールは大きくないと思います。
curl -u login:pass ftp.myftpsite.com/iiumlabs* -O
question: cURLを使用してこのファイルのディレクトリをダウンロードするにはどうすればよいですか?
OK、Windowsを使用していることを考えると、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サーバーへの接続を開きます。次の2行では、ftpが要求するログインとパスワードを指定します(login
とpass
を、キーワードなしのログインとパスワードのみに置き換えます)。次に、mget *
を使用してすべてのファイルを取得します。 *
の代わりに、任意のワイルドカードを使用できます。最後に、quit
を使用して、対話型プロンプトなしでftp
プログラムを閉じます。
最初にディレクトリを入力する必要がある場合は、cd
の前にmget
コマンドを追加します。それはかなり簡単なはずです。
最後に、そのファイルを書き、次のようにftp
を実行します。
ftp -i -s:yourscript
ここで、-i
は(ファイルをダウンロードする前に確認する)対話機能を無効にし、-s
は作成したスクリプトへのパスを指定します。
悲しいことに、SSH経由のファイル転送はWindowsでネイティブにサポートされていません。ただし、その場合は、おそらく PuTTY ツールを使用する必要があります。この場合に特に興味深いのは、pscp
です。これは、実際にはopenssh scp
コマンドのPuTTYカウンターパートです。
構文はcopy
コマンドに似ており、ワイルドカードをサポートしています。
pscp -batch [email protected]:iiumlabs* .
キーファイルを使用して認証する場合は、-i path-to-key-file
を使用して渡す必要があります。パスワードを使用する場合は、-pw pass
。また、load -load your-session-name
引数を使用して、PuTTYを使用して保存されたセッションを再利用できます。
Curlに縛られていない場合は、再帰モードで wget を使用しますが、1レベルの再帰に制限します。次を試してください。
wget --no-verbose --no-parent --recursive --level=1\
--no-directories --user=login --password=pass ftp://ftp.myftpsite.com/
--no-parent
:再帰的に取得するとき、親ディレクトリに昇ってはいけません。--level=depth
:再帰最大深度レベル深度を指定します。デフォルトの最大深度は5レイヤーです。--no-directories
:再帰的に取得するときにディレクトリの階層を作成しません。このようなものはどうですか:
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
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
ああ、必要なものだけがあります!
$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:[email protected]");
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 = "[email protected]";
$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サーバーに配置し、ファイルをダウンロードするFTPサーバーのアドレス(IPではない)に$ ipを変更し、このファイルと同じディレクトリにdownloadedFilesという名前のディレクトリを作成します。
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!
なぜskip = 2? .
および..
なぜdelims =?スペースを含む名前をサポートするには