根据模式过滤R中的文件名



我有一个目录中文件的列表,格式为

Firstname-Lastname-DateofBirth-ID.pdf

,例如Tom-Hanks-01.01.1960-5555.pdfID目前是4位数字,但将来可能是5位或6位。

我有一个id向量,其对应的pdf文件我想移动到另一个目录

我希望R读取目录中的文件列表,从文件名中识别ID,检查ID是否在要移动的ID向量中,如果是,则移动文件。

我可以用if(),%in%system()来做后一部分。怎样才能做过滤呢?

首选tidyverse方案。

如果我不能提供一个可复制的例子,请原谅。但是,仅仅读取文件名并从文件名中提取ID就会有所帮助。

假设当前工作目录中有以下文本文件:

$ ls *.txt
Tom-Hanks-01.01.1960-11.txt  
Tom-Hanks-01.01.1960-88.txt    
Tom-Hanks-01.01.1960-4444.txt
Tom-Hanks-01.01.1960-5555.txt
Tom-Hanks-01.01.1960-123456.txt  

我想将ID为111、222、5555、88和123456的文件移动到当前名为dest的文件夹中。所以我们可以这样做,

library(fs)
library(stringr)
# grab the text files
files <- fs::dir_ls(".", glob = "*.txt")
id_to_move <- c(111, 222, 5555, 88, 123456)
# match the pattern which files we need to move.
files_to_move <- files[str_extract(files, "(?<=-)\w+(?=.txt)") %in% id_to_move]
# move the file.
fs::file_move(files_to_move, "dest")
$ ls dest
Tom-Hanks-01.01.1960-123456.txt  
Tom-Hanks-01.01.1960-5555.txt  
Tom-Hanks-01.01.1960-88.txt

底距R:

filelist <- list.files(pattern = "*.csv")

filelist
[[1]]
[1] "Tom-Hanks-01.01.1960-11.pdf"

[[2]]
[1] "Tom-Hanks-01.01.1960-88.pdf"

[[3]]
[1] "Tom-Hanks-01.01.1960-4444.pdf"

[[4]]
[1] "Tom-Hanks-01.01.1960-5555.pdf"

[[5]]
[1] "Tom-Hanks-01.01.1960-123456.pdf"
idsToMove <- c(1111, 2222, 3333, 4444, 5555)
toMove <- filelist[sapply(filelist, FUN = (x) strsplit(x=x, split = "-|.pdf", perl=TRUE)[[1]][4] %in% idsToMove)]
> toMove
[[1]]
[1] "Tom-Hanks-01.01.1960-4444.pdf"
[[2]]
[1] "Tom-Hanks-01.01.1960-5555.pdf"

最新更新