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

时间:2016-05-31 16:57:31

标签: r copy-paste file-manipulation

假设我有3个文件夹,每个文件夹中包含大量文件,我只想从每个子目录中选择几个文件,并仅将这些文件粘贴到新文件夹中。 我们打电话给3个文件夹:

  • 桌面/目录/ sub_11s_gi01_ab
  • 桌面/目录/ sub_11f_gi01_b
  • 桌面/目录/ sub_12s_gi02_ms

需要复制的文件的扩展名为“.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在这里不起作用,但我不知道如何创建一个只选择我想要的文件并将它们复制到一个文件夹的函数。我总共有大约50个子文件夹,每个子文件夹有大约1GB的数据,所以再次复制所有数据然后删除我不想要的东西都不是一个选项。非常感谢任何帮助

2 个答案:

答案 0 :(得分:0)

您的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将包含一个命名逻辑向量,您可以在复制文件时遇到任何问题进行探索。

答案 1 :(得分:0)

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

在此之后,您需要选择相关文件:

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

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

或者你可以在一步中使用pattern参数list.files来执行此操作:

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)
相关问题