2016-05-31 2 views
0

Предполагая, что у меня есть 3 папки с большим количеством файлов в каждом, я хочу выбрать только несколько файлов из каждого подкаталога и вставить только эти файлы в новая папка. Назовем 3 папки:Копирование определенных файлов из нескольких подкаталогов в одну папку в R

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

ответ

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)] 

(Обратите внимание на двойные побеги до того точек:. \\. - точка имеет особое значение для 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) 
+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 будет содержать именованный логический вектор, который можно исследовать в случае каких-либо проблем при копировании файлов.

Смежные вопросы