Feb 262012
 

In questi giorni ho dovuto scaricare un sacco di file da un server FTP remoto, la soluzione migliore in casi come questo è collegarsi sul ​​server remoto e fare un archivio compresso di tutti i file (per questo uso tar -zcvf ArchiveName.tgz /ercorso/da/archiviare/), in questo modo dovrete scaricare solo 1 file che è anche stato compresso e FTP può fare perfettamente questo lavoro.

Ma questa volta non avevo alcuna shell sul server remoto, solo un account FTP, quindi qual è il modo migliore per scaricare un gran numero di file in modo ricorsivo?


Come prima cosa ho dato uno sguardo alla pagina di manuale di ftp, ah ho dimenticato di dire che la macchina in cui devo scaricare tutti i file è un server senza interfaccia grafica quindi nessun client FTP grafico a portata di mano, guardando la pagina del man FTP , la cosa più simile di quello che mi serviva era il comando mget:

mget file-remoti
Espandere i file-remoti sulla macchina remota ed esegui un get
per ogni nome di file che viene prodotto. Vedere glob per i dettagli su
come si espande il nome del file. I nomi dei file risultanti saranno quindi
elaborati a seconda dei casi e delle impostazioni di ntrans e di nmap.
I file vengono trasferiti nella directory di lavoro locale, che
può essere cambiata con ‘lcd directory’; nuove directory locali
possono essere create con ‘! mkdir directory ‘.

Quindi utile, ma non per me in questo caso in cui ho più sottodirectory, quindi con una rapida ricerca su Google ho scoperto che semplicemente il protocollo FTP non supportano il download ricorsivo e quindi è necessario utilizzare le opzioni dei client per farlo, vediamo quindi come farlo con wget.

Wget

GNU Wget è un pacchetto software gratuito per il recupero dei file tramite HTTP, HTTPS e FTP, i protocolli di Internet più utilizzati. Si tratta di un tool non-interattivo a riga di comando, quindi può essere facilmente chiamato da script, cron jobs, terminali senza il supporto di X-Windows, ecc
Quindi questo sembra lo strumento perfetto per essere utilizzato su un server, come plus wget è presente di sicuro in qualsiasi repository delle distribuzione Linux e ciò rende l’installazione è banale.

La sintassi di base per wget è

wget ftp://myusername:mypassword@ftp.yoursite.com/yourfile

Con un comando come questo si utilizza il protocollo FTP con l’account myusername e la password mypassword per prelevare da ftp.yoursite.com il file tuofile.
Ma abbiamo bisogno di alcune opzioni extra per avere un download ricorsivo dal sito FTP.

Opzioni Extra

-r –recursive Attiva il download ricorsivo.

-l profondità –level=profondità Specifica la profondità massima di ricorsione. La profondità massima di default è 5.

Così il nostro comando diventa:

wget -r --level=99 ftp://myusername:mypassword@ftp.yoursite.com/

In questo modo, a partire dalla directory root wget scarica in modo ricorsivo fino a 99 livelli (oppure è possibile utilizzare inf per infinito)


Oppure è possibile utilizzare l’opzione -m (che sta per mirror)
L’opzione -m attiva il mirroring cioè attiva la ricorsione ed il time-stamping, imposta una profondità infinita di ricorsione e mantiene gli elenchi di directory FTP:

wget -m ftp://myusername:mypassword@ftp.yoursite.com/

Se come me avete un sito molto grande vi suggerisco di eseguirlo con un nohup davanti al comando ed eseguirlo in background.

Un consiglio finale per wget, se si deve ri-scaricare lo stesso sito, è possibile utilizzare anche l’opzione -nc, in questo modo i file non verranno scaricati 2 volte.

-nc –no-clobber
Se un file è stato scaricato più di una volta nella stessa directory, Il comportamento di Wget dipende da alcune opzioni, tra cui -nc. In alcuni casi, il file locale verrà sovrascritto, al momento del download. In altri casi sarà conservata.

Durante l’esecuzione di Wget con -r o -p, ma senza -N, -nd, o -nc, ri-scaricare un file risulta semplicemente nel fare una nuova copia , basta sovrascrivere il vecchio. Aggiungendo -nc questo comportamento sarà impedito , provocando invece la conservazione della versione originale e di tutti i file recenti presenti sul server.

Enhanced by Zemanta

+

Popular Posts:

Flattr this!

  8 Responses to “Come scaricare in maniera ricorsiva da un sito FTP”

  1. Your third paragraph says about mget, then you switch to wget. Where is the truth?

    • Mget is good if you have to download multiple files from 1 source directory only.
      Wget if you have to go down recursively

  2. I’m a communication researcher and sometimes my students and I want to analyze posts to public message boards. To have a local copy of the posts we’ve been having to copy and paste each page individually. We generally need thousands of posts, so this is tedious. Is there some way to use wget or a similar utility to do this in a more automated way? We can work from Linux, OS X, or Windows.

  3. Dale, have a look at HTTRACK: http://www.httrack.com/

  4. Many thanks, DD. I’m going to try it in the morning.

  5. mget is a popular command in FTP sessions and is short for “multiple get” (“get” downloads 1 file, “put” uploads 1).
    A utility like wget offers much more flexibility than the standard “ftp” utility, like different protocols (ftp, http,…), recursive downloading, automatic retries, time-stamping to get only newer files, …

    Alternatives to wget are lftp (http://lftp.yar.ru/) or ncftp on linux, but I’m sure there are tons of these around.

    @Dale Hample: wget can also download html pages in full, with some options to convert links so they work locally and so on.

  6. yafc
    get -r dir
    bingo

  7. Hi,

    I’m new here.

    I was going to recommend HTTRACK but someone has already beaten me to it, you only have to enter the top domain name and it will download all files contained or you can go down levels.
    You can also set it in a cron tab so that it will keep the local copy upto date, I use to use this method for syncing my two lampp stacks, it may even work with FTP.

Leave a Reply to darkduck Cancel reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

*