2010-04-10 2 views
6

J'écris un petit shellscript qui doit parcourir tous les dossiers et fichiers sur un serveur ftp (récursivement). Jusqu'à présent, tout fonctionne bien avec cURL - mais c'est plutôt lent, parce que cURL démarre une nouvelle session pour chaque commande. Donc, pour 500 répertoires, cURL préforme 500 connexions.Liste de répertoires FTP récursifs dans shell/bash avec une seule session (en utilisant cURL ou ftp)

Est-ce que quelqu'un sait, si je peux rester connecté en utilisant cURL (ce serait ma solution préférée) ou comment je peux utiliser ftp avec une seule session dans un script shell?

Je sais comment exécuter un ensemble de commandes ftp et récupérer la réponse, mais pour la liste récursive, il doit être un peu plus dynamique ...

Merci pour votre aide!

Répondre

-1

Si vous souhaitez simplement créer une liste de tous les fichiers et dossiers, vous pouvez utiliser ssh à la place. Quelque chose comme ça (mais il faut vérifier la documentation sur l'utilisation correcte)

$ ssh [email protected] "ls -R /path" 
+1

Cela ne répond pas vraiment à la question. Nous ne savons pas qu'il a un accès de coquille. Cela devrait être un commentaire. –

0

Vous pouvez vous connecter au serveur FTP d'une manière qu'il accepte les commandes de stdin et écrit à stdout. Créez deux tubes nommés ("fifos", man mkfifo), redirigez stdin et stdout de la commande ftp chacun à l'un d'entre eux. Ensuite, vous pouvez écrire des commandes sur le fifo stdin-connected-fifo et les lire (ligne par ligne avec read de bash par exemple) à partir de stdout-fifo. Ensuite, utilisez les résultats pour voir où vous devez envoyer une autre commande de listage (et l'imprimer ou tout ce que vous voulez faire)

En bref: Quelque chose bash scripting est approprié pour :) (Jusqu'à ce que vous trouviez un outil qui fait quoi vous voulez par lui-même bien sûr)

9

La commande est actuellement ncftpls -R. Il listera récursivement tous les fichiers dans un dossier ftp.

3

Si possible, essayez usign script lftp:

# lftp script "myscript.lftp" 
open your-ftp-host 
user username password 
cd directory_with_subdirs_u_want_to_list 
find 
exit 

La prochaine chose que u besoin est script bash pour exécuter cette commande lftp et l'écrire dans le fichier:

#!/bin/bash 
lftp -f myscript.lftp > myOutputFile 

myOutputFile contient maintenant le vidage complet des répertoires.

+0

la solution 'lftp' fonctionnera réellement avec le serveur FTP de Windows, même si le support de' ls -R' est supprimé: http://support.microsoft.com/kb/2007929. Merci ! – malat

3

Juste pour résumer ce que les autres ont dit jusqu'à présent. Si vous essayez d'écrire un script shell portable qui fonctionne comme un fichier batch, vous devez utiliser la solution lftp car some FTP server peut ne pas implémenter ls -R. Il suffit de remplacer 123.456.789.100 par l'adresse IP réelle du serveur ftp dans les exemples suivants:

$ lftp -c "open 123.456.789.100 && find -l && exit" > listing.txt 

Voir la page man de lftp, allez à la section find:

Liste des fichiers dans le répertoire (répertoire courant par défaut) récursivement. Cela peut aider avec les serveurs qui ne supportent pas ls -R. Vous pouvez rediriger la sortie de cette commande.

Toutefois, si vous avez un moyen de savoir si oui ou non le serveur ftp distant implémente un soutien approprié pour ls -lR, puis une solution beaucoup mieux (= plus rapide) sera:

$ echo ls -lR | ftp 123.456.789.100 > listing.txt 

Juste pour référence si j'exécute la première commande (lftp + find) il faut 0m55.384s pour récupérer la liste complète, tandis que si j'exécute la seconde (ftp + ls-R), cela prend 0m3.225s.

Questions connexes