Come scaricare in maniera ricorsiva da un sito FTP

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/tuofile

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.