Как переименовать файлы с определенным шаблоном в R? - PullRequest
5 голосов
/ 23 октября 2011

В каталоге есть несколько .fcs файлов в формате data.000X (где X = 1, 2, 3 ...).

Я хочу переименовать каждый n файл в следующий формат: exp.fcs (где exp - текст из вектора), еслипереименованный файл - это файл .fcs .

другими словами : я хочу переименовать файлы в exp.txt, где 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 (от, до) , но не удалось, так как аргументы имеют разную длину (и я не знаю, что это значит):

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

Ответы [ 3 ]

4 голосов
/ 23 октября 2011

Судя по вашим комментариям, одна проблема заключается в том, что ваш первый файл не называется «data.001» - он называется «data.1».Используйте это:

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

Это добавляет до 3 0 (так как кажется, что у вас более 1000 файлов, это может быть лучше) до индексов <1000, так что все имена имеют одинаковую ширину.Если вы действительно хотите видеть такие вещи, как «data.001», то используйте <code>%.3d в команде.

4 голосов
/ 23 октября 2011

Ваш код «работает» на моей машине («работает» в том смысле, что, когда я создал набор файлов и выполнил вашу процедуру, переименование произошло правильно).Вероятно, ошибка состоит в том, что количество файлов, которые у вас есть (length(a)), отличается от количества новых имен, которые вы даете (length(b)).Отправьте обратно, если окажется, что эти объекты имеют одинаковую длину.

1 голос
/ 17 сентября 2013

Как и в случае с (очень похожим) вопросом здесь , эта функция может быть вам полезна.Я написал это, чтобы позволить regex находить и заменять в 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)
}
...