0

我在目录文件夹中存储了许多(子)文件夹。每个子文件夹包含 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”,并且我已将这些线程作为链接附加到下面。我正在尝试尽可能多地阅读这些功能,但到目前为止,使其工作的过程让我陷入困境。

如何使用批处理文件将文件夹中的文件重命名为文件夹名称

根据文件夹名称重命名文件

真挚地,

亨利

4

2 回答 2

0

您可能必须在 Windows 上更改为dir_separator\

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)))
于 2017-11-29T17:19:20.503 回答
0

一种递归方法。

将路径传递到包含您的文件和要重命名的文件的扩展名的根文件夹,以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)
  }

  }    
}
于 2017-11-29T18:05:23.070 回答