将多个子目录中的特定文件复制到 R 中的单个文件夹中

Copying specific files from multiple sub-directories into a single folder in R

假设我有 3 个文件夹,每个文件夹中都有大量文件,我想 select 每个子目录中只有几个文件,然后只将这些文件粘贴到一个新文件夹中。 让我们调用 3 个文件夹:

需要复制的文件的扩展名为“.wang.tax.sum”

不能复制所有其他文件然后删除,因为这需要几天时间。

从其他问题来看,我可以将所有文件组合成一个列表并复制所有文件,但我不知道如何只复制以 .wang.tax.sum
结尾的文件 我可以使用 grep 函数获取要传输的文件列表,但不确定如何将子目录中的文件列表复制到新文件夹。 这是我目前所拥有的,但没有用。

parent.folder <- "C:/Desktop/dir"
my_dirs <- list.files(path = parent.folder, full.names = T, recursive = T, include.dirs = T)

##this does not work##
a <- grep("wang.tax.sum",my_dirs)
my_dirs <- my_dirs[a]

files <- sapply(my_dirs, list.files, full.names = T)

dir.create("taxsum", recursive = T)

for(file in files) {
  file.copy(file, "taxsum")
}

我知道 grep 在这里不起作用,但我不确定如何创建一个只 select 我想要的文件并将它们复制到一个文件夹的函数。我总共有大约 50 个子文件夹,每个子文件夹都有大约 1gb 的数据,因此再次复制所有数据然后删除我不想要的数据不是一种选择。非常感谢任何帮助

您的 my_dirs 已包含完整文件名,因此无需创建 files 变量。

parent.folder <- "Desktop"
ext <- ".jpg"                 # Wanted file extension

my_dirs <- list.files(path = parent.folder, 
    full.names = TRUE, recursive = TRUE, include.dirs = TRUE)

dir.create("Desktop/temp", recursive = TRUE)

n <- sapply(my_dirs[grep(ext, my_dirs)], 
    FUN=function(x) file.copy(from = x, to = "Desktop/temp/"))

message(paste("Number of files in", parent.folder, "with", ext, ":", length(n), 
    "(successully copied:", round(sum(n)/length(n)*100, 0), "%).")) 

# Number of files in Desktop with .jpg : 4 (successully copied: 100 %).

变量n将包含一个命名的逻辑向量,您可以在复制文件时遇到任何问题时探索它。

parent.folder <- "C:/Desktop/dir"
files <- list.files(path = parent.folder, full.names = T, recursive = T, include.dirs = T)

之后你需要select相关文件:

files <- files[grep("wang\.tax\.sum", files)]

(注意点之前的两次转义:\. - 点对 grep 有特殊含义。)

或者您可以一步完成 list.files 的 pattern 参数:

files <- list.files(path = parent.folder, full.names = T, recursive = T, include.dirs = T, pattern = "wang\.tax\.sum")

正在创建新目录:

dir.create("taxsum", recursive = T)

现在您需要创建新的文件名:

newnames <- paste0("taxsum/", gsub("/|:", "_", files))
# replace "special" characters with underscore
# so that your file names will be different and contain the 
# original path

# alternatively, if you know that file names will be different:
newnames <- paste0("taxsum/", basename(files))

现在您可以使用 mapply 进行复制(同样可以使用 for 来完成,但需要付出一些额外的努力):

mapply(file.copy, from=files, to=newnames)