web-dev-qa-db-ja.com

ディレクトリ内のすべてのファイルをcURLでダウンロードする

CURLを使用して、特定のディレクトリ内のすべてのファイルをダウンロードしようとしています。

ファイルのリストは次のようになります。

enter image description here

私は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が要求するログインとパスワードを指定します(loginpassを、キーワードなしのログインとパスワードのみに置き換えます)。次に、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を使用して保存されたセッションを再利用できます。

11
Michał Górny

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:再帰的に取得するときにディレクトリの階層を作成しません。
34
kkeller

このようなものはどうですか:

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
Robi

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
2

ああ、必要なものだけがあります!

$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という名前のディレクトリを作成します。

1
Prasanth

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 =?スペースを含む名前をサポートするには

1
kiwixz