【问题标题】:Add a suffix to filenames based on subfolder names within a directory in R根据 R 中目录中的子文件夹名称为文件名添加后缀
【发布时间】:2018-05-13 09:57:24
【问题描述】:

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

How to rename files in folders to foldername using batch file

Rename Files Based On Folder Name

此致,

亨利

【问题讨论】:

    标签: r loops for-loop rename pushd


    【解决方案1】:

    您可能需要在 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)))
    

    【讨论】:

      【解决方案2】:

      递归方法。

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

      【讨论】:

        猜你喜欢
        • 2020-11-10
        • 1970-01-01
        • 2018-11-10
        • 1970-01-01
        • 2018-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        相关资源
        最近更新 更多