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

У меня есть более 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

person sacvf    schedule 25.05.2012    source источник
comment
Очень похоже на stackoverflow.com/q/7864931/602276   -  person Andrie    schedule 25.05.2012


Ответы (3)


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

Итак, что-то вроде:

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

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

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

Я отложу вопрос: "А зачем тебе это?" поскольку вы, кажется, выбрасываете информацию в имени файла, но, по-видимому, эта информация содержится и в другом месте.

person Brian Diggs    schedule 25.05.2012
comment
Трудно прочитать ошибку в комментариях. Похоже, что dir2 содержит имена файлов, которые нужно переименовать, так что это должно быть первым аргументом для file.rename (вместо другого вызова list.files). И вам все равно не хватает закрывающей скобки в конце вызова list.files внутри file.rename. - person Brian Diggs; 25.05.2012
comment
Привет @Brian, когда я делаю то же самое, я получаю сообщение FALSE. Файлы не переименовываются. Целевая папка с именем tmp_rename содержит три случайных файла. А вот мой код list.files('tmp_rename') %>% file.rename(to = c('a','b','c')) - person Jiaxiang; 13.08.2018
comment
понравилось ваше решение, к сожалению, ваше решение не применимо к именам файлов в кодировке UTF8, таким как: קובץ מספר 1.xls קובץ מספר 2.xls קובץ מספר 3.xls - person amann; 16.12.2019

Я написал это для себя. Это быстро, позволяет регулярное выражение при поиске и замене, может игнорировать суффикс файла и может показать, что произойдет в пробном запуске, а также защитить от перезаписи существующих файлов.

Если вы находитесь на 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)
    }
}
person tim    schedule 17.09.2013

Если вы хотите заменить определенный раздел имени файла, который соответствует заданному шаблону, другим шаблоном. Это полезно для переименования нескольких файлов одновременно. Например, этот код возьмет все ваши файлы, содержащие foo, и заменит foo на bob в именах файлов.

file.rename(list.files(pattern = "foo"), str_replace(list.files(pattern = "foo"),pattern = "foo", "bob"))
person Jamie Tock    schedule 16.07.2021