2015-09-09 1 views
2

Existe-t-il un moyen de trouver la date et l'heure modifiées pour les fichiers sur un serveur FTP dans R? J'ai trouvé un excellent moyen de lister tous les fichiers disponibles, mais je veux seulement télécharger ceux qui ont été mis à jour depuis ma dernière vérification. J'ai essayé d'utiliser:Récupérer DateTime modifié d'un fichier à partir d'un serveur FTP

info<-file.info(url) 

Cependant, il renvoie une liste assez laide de rien. Mon URL est composée de: « ftp://username:[email protected]//filepath.xml »

+0

il serait utile si vous pouviez au moins afficher la sortie d'un répertoire listant – hrbrmstr

Répondre

4

Jusqu'à ce que nous voyons la sortie de ce particulier serveur FTP (ils sont tous différents) pour les listes de répertoires, voici un chemin que vous pouvez suivre:

library(curl) 
library(stringr) 

Obtenez la liste des répertoires brut:

con <- curl("ftp://ftp.FreeBSD.org/pub/FreeBSD/") 
dat <- readLines(con) 
close(con) 
dat 

## [1] "-rw-rw-r-- 1 ftp  ftp   4259 May 07 16:18 README.TXT" 
## [2] "-rw-rw-r-- 1 ftp  ftp   35 Sep 09 21:00 TIMESTAMP" 
## [3] "drwxrwxr-x 9 ftp  ftp   11 Sep 09 21:00 development" 
## [4] "-rw-r--r-- 1 ftp  ftp   2566 Sep 09 10:00 dir.sizes" 
## [5] "drwxrwxr-x 28 ftp  ftp   52 Aug 23 10:44 doc"   
## [6] "drwxrwxr-x 5 ftp  ftp    5 Aug 05 04:16 ports"  
## [7] "drwxrwxr-x 10 ftp  ftp   12 Sep 09 21:00 releases" 

Filtrer les répertoires:

no_dirs <- grep("^d", dat, value=TRUE, invert=TRUE) 
no_dirs 

## [1] "-rw-rw-r-- 1 ftp  ftp   4259 May 07 16:18 README.TXT" 
## [2] "-rw-rw-r-- 1 ftp  ftp   35 Sep 09 21:00 TIMESTAMP" 
## [3] "-rw-r--r-- 1 ftp  ftp   2566 Sep 09 10:00 dir.sizes" 

Extrait simplement l'horodatage et le nom:

date_and_name <- sub("^[[:alnum:][:punct:][:blank:]]{43}", "", no_dirs) 
date_ane_name 
## [1] "May 07 16:18 README.TXT" 
## [2] "Sep 09 21:00 TIMESTAMP" 
## [3] "Sep 09 10:00 dir.sizes" 

les mettre dans un data.frame:

do.call(rbind.data.frame, 
     lapply(str_match_all(date_and_name, "([[:alnum:] :]{12}) (.*)$"), 
       function(x) { 
       data.frame(timestamp=x[2], 
          filename=x[3], 
          stringsAsFactors=FALSE) 
})) -> dat 
dat 

##  timestamp filename 
## 1 May 07 16:18 README.TXT 
## 2 Sep 09 21:00 TIMESTAMP 
## 3 Sep 09 10:00 dir.sizes 

Vous devez toujours convertir l'horodatage à un POSIXct mais qui est trivial.

Cet exemple particulier dépend de la réponse à la liste de répertoires FTP de ce système. Changez juste les expressions rationnelles pour le vôtre.

+1

MERCI BEAUCOUP. Cela semble fonctionner parfaitement. – user3267547

+0

heureux que cela a fonctionné. une coche dans la case répondue sera la bienvenue. – hrbrmstr

+1

au cas où cela aiderait quelqu'un d'autre, si votre ftp a des mots de passe, utilisez: con <- curl ("utilisateur: pwd @ ftp: //ftp.FreeBSD.org/pub/FreeBSD/") – andrewm4894