Вопрос по r – Как переименовать файлы с помощью R?

32

У меня есть более 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
Очень похоже наstackoverflow.com/q/7864931/602276 Andrie

Ваш Ответ

2   ответа
4

позволяет регулярное выражение в поиске и замене и поддерживает "пробные версии".

Если вы работаете на 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)
}
45

file.rename переименует файлы, и это может занять вектор обоихfrom а такжеto имена.

Так что-то вроде:

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

может работать.

Если вам нужен конкретный порядок, вы можете либо отсортировать список файлов, которые существуют в настоящее время, либо, если они следуют определенному шаблону, просто создать вектор имен файлов напрямую (хотя я отмечаю, что 700 не кратно 30).

Я оставлю в стороне вопрос: «Зачем вам это нужно?» так как вы, кажется, выбрасываете информацию в имени файла, но, вероятно, эта информация содержится и в другом месте.

Error: User Rate Limit Exceededdir2Error: User Rate Limit Exceededfile.renameError: User Rate Limit Exceededlist.filesError: User Rate Limit Exceededlist.filesError: User Rate Limit Exceededfile.renameError: User Rate Limit Exceeded
Error: User Rate Limit ExceededFALSEError: User Rate Limit Exceededtmp_renameError: User Rate Limit Exceededlist.files('tmp_rename') %>% file.rename(to = c('a','b','c'))

Похожие вопросы