【问题标题】:renaming file based on folder names with R使用R根据文件夹名称重命名文件
【发布时间】:2018-02-02 15:41:52
【问题描述】:

我有一个文件夹 Tmin,其中包含 18 个文件夹。 18 个文件夹中的每一个都包含数百个文件。我想用 R 创建一个程序,允许为每个文件添加文件夹文件的名称。我不想用不同的名称重命名每个文件,我只想在文件名的开头添加文件夹名称。我是 R 和编程方面的新手。我无法拥有可以为每个文件夹重复操作的批处理功能。您可以找到附上的两张图片,它们显示了我想要获得的东西。

例如,文件夹“MACA_Miroc”中名为“name_date.tiff”的文件将变为“MACA_Miroc_name_date.tiff”。此外,我想为每个文件夹自动重复操作。提前感谢您的帮助!

Wanted situation and organization of my folders and file

【问题讨论】:

  • 首先,图片是一种不好的展示方式。它们不能保证始终可用,并且某些工作场所会阻止文件共享站点。您可以在this question 中以文本形式编写文件树。二、你试过list.files()file.rename()吗?
  • 是的,在文件 .rename 中,我包含 list.files。我的问题是我不知道如何让程序自动将我的文件夹名称添加到所有文件中,并且它会为我的所有文件夹重复该过程。我希望我的解释清楚。
  • normalizePath() 函数将为您提供整个路径,但您必须对其进行处理才能获得所需的部分,删除目录之间的 / 或 \\,并使用 gsub() 加入它们和paste0()。您还可以使用dir( ., full.names=TRUE, recursive=TRUE) 从当前目录中获取名称。您仍然必须将它们处理成有效的文件名。

标签: r file batch-rename


【解决方案1】:

这应该可以工作:

mydir <- getwd()  
primary_folder <- "C:/Users/Desktop/Test_Data/"
subfolders <- grep("*MACA*", list.dirs(primary_folder, full.names = T, recursive = F), 
                   value = T)

renameFunc <- function(z){
  setwd(z)
  fnames <- dir(recursive = F, pattern= ".tiff|.csv")
  addname <- substr(z, nchar(primary_folder)+2, nchar(z))

  lapply(fnames, function(current_name){
    #Regex to get extension, may need to addd $ sign to signify end of file name
    ptrn <- ".*\\.([a-zA-Z]{2,4})" 
    extension <- regmatches(current_name, regexec(ptrn, current_name))[[1]][2]
    no_extension <- gsub(paste(".",extension, sep = ""), "", current_name)
    new_name <- paste(gsub("_"," ", no_extension), " ", addname, ".", extension, sep = "")
    file.rename(current_name, new_name)
  })
}

lapply(subfolders, readFunc)

setwd(mydir)

我认为如果您不在要更改文件名的目录中,则必须指定全名。更改工作目录是一种快速的方法,但您可以使用全名(使用正则表达式来获取正确的 fromto 值,用于 file.rename())。当我不在要更改名称的目录中时,我在一次点上遇到了一些错误。

我觉得这可以让您更好地控制要更改名称的文件夹,因为不正确的操作可能会非常混乱。您可能还想跳过一些文件扩展名或子文件夹等。

【讨论】:

  • 谢谢,我可以理解更多的推理。但是,我仍然不明白如何将我的文件夹名称添加到我的每个文件中,例如“name.date”。例如,我想为文件夹 MACA_MIROC 中包含的所有文件添加 MACA_MIROC,为文件夹 MACA_grs 中包含的所有文件添加 MACA_grs 等。我可以看到使用该函数似乎是最好的方法。
  • 在我定义new_name 的代码中,您需要粘贴文件夹名称而不是字符串name。文件夹名称可以通过使用substrsubfolder 中减去primary_folder 获得。我将编辑上面的代码。
  • 我刚试过,效果很好!非常感谢您的帮助!
【解决方案2】:

你的路径文件夹

folder<-"C:/path/example/"

提取文件列表

files<-list.files(folder)

提取文件夹名称

folder_name<-unlist(strsplit(folder,"/"))[length(unlist(strsplit(folder,"/")))]

重命名所有文件

file.rename(from = paste0(folder,files),to = paste0(folder,folder_name,"_",files))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2014-08-03
    • 2013-02-22
    相关资源
    最近更新 更多