如何使用R重命名文件?

sac*_*cvf 39 r file-rename

我在一个文件夹中有超过700个文件,命名为:从第1个到第9个的文件在第一个月命名:

water_200101_01.img  
water_200101_09.img  
Run Code Online (Sandbox Code Playgroud)

从10号到30号的文件命名为:

water_200101_10.img
water_200101_30.img
Run Code Online (Sandbox Code Playgroud)

等第二个月:从1号到9号的文件被命名为:

water_200102_01.img  
water_200102_09.img  
Run Code Online (Sandbox Code Playgroud)

从10号到30号的文件命名为:

water_200102_10.img
water_200102_30.img 
Run Code Online (Sandbox Code Playgroud)

如何在不对文件进行任何更改的情况下重命名它们.例如,只需改变纳米

water_1
water_2
...till...
water_700
Run Code Online (Sandbox Code Playgroud)

Bri*_*ggs 55

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

所以类似于:

file.rename(list.files(pattern="water_*.img"), paste0("water_", 1:700))
Run Code Online (Sandbox Code Playgroud)

可能有用.

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

我会抛开一个问题,"你为什么要这样做?" 因为你似乎丢弃了文件名中的信息,但可能是信息也包含在其他地方.

  • 很难在评论中阅读错误.看起来`dir2`包含要重命名的文件的名称,因此应该是`file.rename`的第一个参数(而不是另一个`list.files`调用).无论如何,你在`file.rename`里面的`list.files`调用结尾处缺少一个右括号. (4认同)

小智 8

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

file.rename(list.files(pattern = "foo"), str_replace(list.files(pattern = "foo"),pattern = "foo", "bob"))
Run Code Online (Sandbox Code Playgroud)


tim*_*tim 6

我为自己写的。它速度快,允许查找和替换正则表达式,并支持“试用运行”。

如果您使用的是Mac,它可以使用applescript在Finder中选择当前文件夹作为目标文件夹。

umxRenameFile <- function(baseFolder = "Finder", findStr = NA, replaceStr = NA, listPattern = NA, test = T, overwrite = F) {
    # uppercase = u$1
    if(baseFolder == "Finder"){
        baseFolder = system(intern = T, "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)
    }
    if(is.na(listPattern)){
        listPattern = findStr
    }
    a = list.files(baseFolder, pattern = listPattern)
    message("found ", length(a), " possible files")
    changed = 0
    for (fn in a) {
        findB = grepl(pattern = findStr, fn) # returns 1 if found
        if(findB){
            fnew = gsub(findStr, replace = replaceStr, fn) # replace all instances
            if(test){
                message("would change ", fn, " to ", 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(paste(baseFolder, fn, sep = ""), paste(baseFolder, fnew, sep = ""))
                    changed = changed + 1;
                }
            }
        }else{
            if(test){
                # message(paste("bad file",fn))
            }
        }
    }
    message("changed ", changed)
}
Run Code Online (Sandbox Code Playgroud)