2015-09-09 77 views
2

有沒有辦法找到R中FTP服務器上文件的修改日期/時間?我找到了列出所有可用文件的好方法,但我只想下載自上次檢查後更新的文件。我嘗試過使用:從FTP服務器中檢索文件的修改日期時間

info<-file.info(url) 

但是,它返回一個相當醜陋的沒有任何內容的列表。我的網址是由: 「ftp://username:[email protected]//filepath.xml

+0

如果您至少可以顯示目錄列表 – hrbrmstr

回答

4

直到我們看到這個特殊 FTP服務器的輸出(他們都是不同的)的目錄清單,這裏的路徑可以遵循:

library(curl) 
library(stringr) 

獲取原始目錄列表:

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" 

篩選出目錄:

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" 

只提取時間戳和文件名:

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" 

把它們放入一個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 

你仍然需要時間戳轉換爲POSIXct但這是微不足道的。

這個特殊的例子是依賴於該系統的FTP目錄列表響應。只要改變你的正則表達式。

+1

的輸出結果將非常有幫助。這似乎是完美的。 – user3267547

+0

很高興它的工作。答覆框中的勾號將是最受歡迎的。 – hrbrmstr

+1

如果這對其他人有幫助,如果你的ftp有密碼,使用:con < - curl(「user:pwd @ ftp://ftp.FreeBSD.org/pub/FreeBSD/」) – andrewm4894

相關問題