Копирование определенных файлов из нескольких подкаталогов в одну папку в R

Предполагая, что у меня есть 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 подпапок, каждая из которых содержит около 1 ГБ данных, поэтому снова скопировать все данные, а затем удалить то, что мне не нужно, не вариант. Любая помощь с благодарностью

Ответы на вопрос(2)

Решение Вопроса
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)]

(Обратите внимание на двойные экранированные символы перед точками:\\. - точка имеет особое значение для 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)
 Geochem B02 июн. 2016 г., 17:04
Спасибо, это сработало отлично.

Ваш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 будет содержать именованный логический вектор, который вы можете исследовать в случае каких-либо проблем при копировании файлов.

Ваш ответ на вопрос