如何在R中重命名具有特定模式的文件?

时间:2011-10-22 22:26:57

标签: r rename filenames

目录中的 data.000X 格式(其中X = 1,2,3 ......)中有一些.fcs个文件。

我想将每个 n 文件重命名为以下格式: exp.fcs (其中 exp 是来自矢量的文本)要重命名的文件是 .fcs 文件。

换句话说:我想将文件重命名为exp.txt,其中<​​em> exp 是一个文本,而不是一个连续的字母,即F,cA,K等等。

例如,来自:

data.0001, data.0002, data.0003, data.0004, data.0005, data.0006...  

textF_a.fcs, textF_b.fcs, textF_c.fcs, textVv_a.fcs, textVv_b.fcs, textVv_c.fcs ...  

我尝试用file.rename(from, to)做但由于参数的长度不同而失败(我不知道它的含义):

a <- list.files(path = ".", pattern = "data.*$")  
b <- paste("data", 1:1180, ".fcs", sep = "")  
file.rename(a, b)

3 个答案:

答案 0 :(得分:4)

您的代码在我的机器上“正常工作”(在我创建一组文件并按照您的程序进行重命名时,“工作”)。错误可能是您拥有的文件数(length(a))与您提供的新名称数(length(b))不同。如果事实证明这些对象具有相同的长度,则回发。

答案 1 :(得分:4)

根据您的评论,一个问题是您的第一个文件未命名为“data.001” - 它的名称为“data.1”。使用此:

b <- sprintf("data%.4d.fcs", seq(a)) 

它最多可以预设3 0(因为看起来你有1000多个文件,这可能会更好),因为索引&lt; 1000,这样所有名称都具有相同的宽度。如果您真的只想看到“data.001”之类的内容,请在命令中使用%.3d

答案 2 :(得分:1)

与(非常相似)问题here一样,此功能可能对您有用。我写它是为了允许在R中使用正则表达式查找和替换。如果你在mac上,它可以检测并使用最前面的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)
}