Добавить суффикс к именам файлов на основе имен подпапок в каталоге в R

У меня есть несколько (под) папок, хранящихся в папке каталога. Каждая подпапка содержит от 5 до 35 файлов аэрофотоснимков в формате .jpg, названных по названию и номеру линии полета (т.е.: bej-3-83). Я хотел бы добавить суффикс к каждому из этих файлов на основе подпапки, в которой они хранятся. Например, если «bej-3-83» хранится в подпапке «T13N_10W», я бы хотел, чтобы мой R-скрипт переименовал «bej-3-83» в «bej-3-83-T13N_10W» и т. д. для каждого файла, хранящегося в каждой подпапке.

Я могу частично выполнить этот процесс, хотя все еще с большим количеством ручного ввода, чем мне хотелось бы, используя этот скрипт:

folder = "C:\\...\\T23N_R14W"
files <- list.files(folder,pattern = "\\.jpg$",full.names = T) 
files
   sapply(files,FUN=function(eachPath){ 
   file.rename(from=eachPath,to= sub(pattern="_clip", paste0("_T23N_R14W"),eachPath))
 })

Но, как вы можете видеть, этот сценарий использует ручной ввод имени подпапки, что бесполезно, когда вы пытаетесь создать сценарий, который делает то, что мне нужно, одним махом.

Я вижу похожие вопросы и ответы, в которых используются «pushd» и «popd», и я прикрепил их к тем темам ниже в виде ссылок. Я пытаюсь прочитать как можно больше об этих функциях, но пока процесс, чтобы заставить его работать, застрял.

Как переименовать файлы в папках в имя папки с помощью пакета файл

Переименовать файлы на основе имени папки

Искренне,

Генри


person forest_codes    schedule 29.11.2017    source источник


Ответы (2)


Возможно, вам придется изменить dir_separator на \ в Windows:

make_filename <- function(file_path) {
    s <- unlist(strsplit(file_path, dir_separator))
    fname <- gsub('\\.jpg$', '', s[length(s)])
    parent_dir <- s[(length(s) - 1)]
    new_fname <- paste0(parent_dir, "_", fname, '.jpg')
    path <- paste(s[-length(s)], collapse = dir_separator)
    return(paste(path, new_fname, sep = dir_separator))
}

folder = './data'
dir_separator = '/'
files <- paste0(folder, dir_separator, list.files(folder, recursive = T))
sapply(files, function(x) file.rename(from = x, to = make_filename(x)))
person Fridolin Linder    schedule 29.11.2017

Рекурсивный подход.

Передайте путь к корневой папке, содержащей ваши файлы, и расширение файлов, которые вы хотите переименовать, в rename_batch. По умолчанию рабочий каталог и jpeg.

library(stringr)

# An auxiliary function
rename_file <- function(str, extra){
  file_name <- tools::file_path_sans_ext(str)
  file_ext <- tools::file_ext(str)
  return(paste0(file_name, '-', extra, '.', file_ext))
}

rename_batch <- function(path = "./",
                         extension = 'jpeg'){

  # Separate files from folders
  l <- list.files(path)
  files <- l[grepl(paste0("\\." , extension), l)]
  folders <- list.dirs(path, F, F)

  present_folder <- 
    stringr::str_extract(path, '(?<=/)([^/]+)$')

  # Check if there is a / at the end of path and removes it
  # for consistency
  path_len <- nchar(path)
  last <- substr(path, path_len, path_len)
  if (last == '/') {
    path <- substr(path, 1, path_len - 1)
  }

  if (length(files) > 0) {
    file_updtate <- paste0(path, '/', files)
    file.rename(file_updtate, rename_file(file_updtate, present_folder))
  }

  if (length(folders) > 0) {
  for (i in paste0(path, '/',  folders)) {
   cat('Renaming in:', i, '\n')
   rename_batch(i)
  }

  }    
}
person thepule    schedule 29.11.2017