it-swarm.com.de

alle Dateien in einem Verzeichnis mit cURL herunterladen

Ich verwende cURL, um zu versuchen, alle Dateien in einem bestimmten Verzeichnis herunterzuladen.

so sieht meine Liste der Dateien aus:

enter image description here

Ich habe versucht, in Bash-Skript zu tun: iiumlabs.[].csv.pgp und iiumlabs* und ich denke, Curl ist nicht groß auf Platzhalter.

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

question: Wie lade ich dieses Verzeichnis mit cURL herunter?

In Anbetracht der Tatsache, dass Sie Windows verwenden, ist der einfachste Weg, das Standardwerkzeug ftp zu verwenden, das im Lieferumfang enthalten ist. Ich stütze mich für die folgende Lösung auf Windows XP und hoffe, dass sie auch bei anderen Versionen funktioniert (oder mit geringfügigen Änderungen).

Zunächst müssen Sie eine Batchdatei (Skriptdatei) für das Programm ftp erstellen, die Anweisungen dafür enthält. Nennen Sie es wie Sie möchten und fügen Sie es hinzu:

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

open ftp.myftpsite.com
login
pass
mget *
quit

Die erste Zeile öffnet eine Verbindung zum FTP-Server unter ftp.myftpsite.com. In den beiden folgenden Zeilen werden die Anmeldung und das Kennwort angegeben, nach dem ftp gefragt wird (ersetzen Sie login und pass durch nur Anmeldung und Kennwort ohne Schlüsselwörter). Dann verwenden Sie mget *, um alle Dateien abzurufen. Anstelle von * können Sie einen beliebigen Platzhalter verwenden. Schließlich verwenden Sie quit, um das Programm ftp ohne interaktive Eingabeaufforderung zu schließen.

Wenn Sie zuerst ein Verzeichnis eingeben mussten, fügen Sie vor cd einen mget-Befehl ein. Es sollte ziemlich unkompliziert sein.

Schreiben Sie schließlich diese Datei und führen Sie ftp folgendermaßen aus:

ftp -i -s:yourscript

dabei -i deaktiviert die Interaktivität (fragt nach dem Herunterladen von Dateien) und -s gibt den Pfad zu dem von Ihnen erstellten Skript an.


Leider wird die Dateiübertragung über SSH in Windows nicht nativ unterstützt. Aber für diesen Fall möchten Sie wahrscheinlich PuTTY tools trotzdem verwenden. Von besonderem Interesse für diesen Fall wäre pscp, bei dem es sich praktisch um den PuTTY-Gegenabschnitt des ″Showssh scp-Befehls handelt.

Die Syntax ähnelt dem Befehl copy und unterstützt Platzhalterzeichen:

pscp -batch [email protected]:iiumlabs* .

Wenn Sie sich mit einer Schlüsseldatei authentifizieren, sollten Sie sie mit -i path-to-key-file übergeben. Wenn Sie ein Kennwort verwenden, -pw pass. Sessions, die mit PuTTY gespeichert wurden, können auch mit dem Argument load -load your-session-name wiederverwendet werden.

9
Michał Górny

Wenn Sie nicht an curl gebunden sind, möchten Sie wget im rekursiven Modus verwenden, jedoch auf eine Rekursionsebene beschränken. Versuchen Sie Folgendes:

wget --no-verbose --no-parent --recursive --level=1\
--no-directories --user=login --password=pass ftp://ftp.myftpsite.com/
  • --no-parent: Steigen Sie beim rekursiven Abrufen nicht zum übergeordneten Verzeichnis auf.
  • --level=depth: Geben Sie die maximale Tiefe der Rekursionstiefe an. Die voreingestellte maximale Tiefe beträgt fünf Ebenen.
  • --no-directories: Erstellen Sie keine Verzeichnishierarchie, wenn Sie rekursiv abrufen.
32
kkeller

Was ist mit so etwas:

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
2
Robi

Oh, ich habe genau das, was du brauchst!

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

und Funktionen isFtpUp und saveFtpFile lauten wie folgt:

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;
}

BEARBEITEN:

es ist ein PHP-Skript . Speichern Sie es als .php-Datei, legen Sie es auf Ihrem Webserver ab, ändern Sie $ ip in Adresse (müssen Sie nicht ip sein) des FTP-Servers, von dem Sie Dateien herunterladen möchten, und erstellen Sie ein Verzeichnis mit dem Namen downloadsFiles auf der gleiches Verzeichnis wie diese Datei.

1
Prasanth

So habe ich schnell mit cURL heruntergeladen (ich bin mir nicht sicher, wie viele Dateien es herunterladen kann):

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!

Warum überspringen = 2 ? Fahrt von . und ..

Warum delims = ? Zur Unterstützung von Namen mit Leerzeichen

1
kiwixz

Sie können ein Skript wie folgt für Mac verwenden:

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
0