【问题标题】:How do I rename files using R?如何使用 R 重命名文件?
【发布时间】:2012-06-01 07:18:49
【问题描述】:

我在一个文件夹中有 700 多个文件,名为: 编号 1 到编号 9 的文件以第一个月命名:

water_200101_01.img  
water_200101_09.img  

编号 10 到编号 30 的文件被命名为:

water_200101_10.img
water_200101_30.img

第二个月以此类推: 编号 1 到编号 9 的文件被命名为:

water_200102_01.img  
water_200102_09.img  

编号 10 到编号 30 的文件被命名为:

water_200102_10.img
water_200102_30.img 

如何在不更改文件的情况下重命名它们。只需更改名称,例如

water_1
water_2
...till...
water_700

【问题讨论】:

标签: r file-rename


【解决方案1】:

file.rename 将重命名文件,它可以采用fromto 名称的向量。

比如:

file.rename(list.files(pattern="water_*.img"), paste0("water_", 1:700))

可能会起作用。

如果特别关心顺序,您可以对当前存在的文件列表进行排序,或者如果它们遵循特定模式,则直接创建文件名向量(尽管我注意到 700 不是 30 的倍数) .

我将抛​​开这个问题,“你为什么想要?”因为您似乎在丢弃文件名中的信息,但大概该信息也包含在其他地方。

【讨论】:

  • 很难读取 cmets 中的错误。看起来dir2 包含要重命名的文件的名称,因此这应该是file.rename 的第一个参数(而不是另一个list.files 调用)。无论如何,您在file.rename 内部的list.files 调用末尾缺少一个右括号。
  • 嗨@Brian,当我做类似的事情时,我收到FALSE 消息。文件重命名失败。 tmp_rename 命名的目标文件夹包含三个随机文件。这是我的代码list.files('tmp_rename') %>% file.rename(to = c('a','b','c'))
  • 喜欢您的解决方案,遗憾的是,您的解决方案似乎不适用于 UTF8 编码的文件名,例如:“קובץ מספר 1.xls” “קובץ מספר 2.xls” “קובץ מספר 3.xls”
【解决方案2】:

这是我为自己写的。它速度快,允许在查找和替换中使用正则表达式,可以忽略文件后缀,并且可以显示在“试运行”中会发生什么以及防止覆盖现有文件。

如果你在mac上,它可以使用applescript在Finder中挑选出当前文件夹作为目标文件夹。

umx_rename_file <- function(findStr = "Finder", replaceStr = NA, baseFolder = "Finder", test = TRUE, ignoreSuffix = TRUE, listPattern = NULL, overwrite = FALSE) {
    umx_check(!is.na(replaceStr), "stop", "Please set a replaceStr to the replacement string you desire.")

    # ==============================
    # = 1. Set folder to search in =
    # ==============================
    if(baseFolder == "Finder"){
        baseFolder = system(intern = TRUE, "osascript -e 'tell application \"Finder\" to get the POSIX path of (target of front window as alias)'")
        message("Using front-most Finder window:", baseFolder)
    } else if(baseFolder == "") {
        baseFolder = paste(dirname(file.choose(new = FALSE)), "/", sep = "") ## choose a directory
        message("Using selected folder:", baseFolder)
    }

    # =================================================
    # = 2. Find files matching listPattern or findStr =
    # =================================================
    a = list.files(baseFolder, pattern = listPattern)
    message("found ", length(a), " possible files")

    changed = 0
    for (fn in a) {
        if(grepl(pattern = findStr, fn, perl= TRUE)){
            if(ignoreSuffix){
                # pull suffix and baseName (without suffix)
                baseName = sub(pattern = "(.*)(\\..*)$", x = fn, replacement = "\\1")
                suffix   = sub(pattern = "(.*)(\\..*)$", x = fn, replacement = "\\2")
                fnew = gsub(findStr, replacement = replaceStr, x = baseName, perl= TRUE) # replace all instances
                fnew = paste0(fnew, suffix)
            } else {
                fnew = gsub(findStr, replacement = replaceStr, x = fn, perl= TRUE) # replace all instances
            }
            if(test){
                message(fn, " would be changed to:  ", omxQuotes(fnew))
            } else {
                if((!overwrite) & file.exists(paste(baseFolder, fnew, sep = ""))){
                    message("renaming ", fn, "to", fnew, "failed as already exists. To overwrite set T")
                } else {
                    file.rename(paste0(baseFolder, fn), paste0(baseFolder, fnew))
                    changed = changed + 1;
                }
            }
        }else{
            if(test){
                # message(paste("bad file",fn))
            }
        }
    }
    if(test & changed==0){
        message("set test = FALSE to actually change files.")
    } else {
        umx_msg(changed)
    }
}

【讨论】:

    【解决方案3】:

    如果您想用另一个模式替换与给定模式匹配的文件名的某个部分。这对于一次重命名多个文件很有用。例如,此代码将获取所有包含 foo 的文件,并将文件名中的 foo 替换为 bob。

    file.rename(list.files(pattern = "foo"), str_replace(list.files(pattern = "foo"),pattern = "foo", "bob"))
    

    【讨论】:

      猜你喜欢
      • 2016-02-14
      • 1970-01-01
      • 2020-08-05
      • 2020-01-03
      • 2020-04-03
      • 2011-01-30
      • 2011-03-30
      相关资源
      最近更新 更多