从 FTP 服务器检索文件的修改日期时间
Retrieve modified DateTime of a file from an FTP Server
有没有办法在 R 中的 FTP 服务器上找到修改后的 date/time 文件?我找到了一种列出所有可用文件的好方法,但我只想下载自上次检查以来已更新的文件。我尝试使用:
info<-file.info(url)
但是,它 returns 是一个非常丑陋的空列表。我的 url 由以下部分组成:
“ftp://username:password@FTPServer//filepath.xml”
直到我们看到 这个特定的 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 目录列表响应。只需更改您的正则表达式即可。
有没有办法在 R 中的 FTP 服务器上找到修改后的 date/time 文件?我找到了一种列出所有可用文件的好方法,但我只想下载自上次检查以来已更新的文件。我尝试使用:
info<-file.info(url)
但是,它 returns 是一个非常丑陋的空列表。我的 url 由以下部分组成: “ftp://username:password@FTPServer//filepath.xml”
直到我们看到 这个特定的 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 目录列表响应。只需更改您的正则表达式即可。