我有一个目录中文件的列表,格式为
Firstname-Lastname-DateofBirth-ID.pdf
,例如Tom-Hanks-01.01.1960-5555.pdf
ID目前是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"