wake-up-neo.com

Wie benenne ich Dateien mit R um?

Ich habe über 700 Dateien in einem Ordner mit dem Namen: Dateien von Nummer 1 bis Nummer 9 werden für den ersten Monat benannt:

water_200101_01.img  
water_200101_09.img  

dateien von Nummer 10 bis Nummer 30 heißen:

water_200101_10.img
water_200101_30.img

Und so weiter für den zweiten Monat: Dateien von Nummer 1 bis Nummer 9 werden benannt:

water_200102_01.img  
water_200102_09.img  

dateien von Nummer 10 bis Nummer 30 heißen:

water_200102_10.img
water_200102_30.img 

Wie kann ich sie umbenennen, ohne Änderungen an den Dateien vorzunehmen? Ändern Sie einfach die Namen, zum Beispiel

water_1
water_2
...till...
water_700
36
sacvf

file.rename benennt Dateien um und es kann ein Vektor von from und to Namen verwendet werden.

Also so etwas wie:

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

könnte funktionieren.

Wenn Sie sich speziell um die Reihenfolge kümmern, können Sie entweder die Liste der derzeit vorhandenen Dateien sortieren oder, wenn sie einem bestimmten Muster folgen, den Vektor der Dateinamen direkt erstellen (obwohl 700 kein Vielfaches von 30 ist).

Ich werde die Frage beiseite legen: "Warum würdest du das wollen?" da Sie Informationen im Dateinamen wegzuwerfen scheinen, diese Informationen aber vermutlich auch an anderer Stelle enthalten sind.

52
Brian Diggs

Ich habe das für mich geschrieben. Es ist schnell, ermöglicht reguläres Suchen und Ersetzen und unterstützt "Probeläufe".

Wenn Sie auf einem Mac arbeiten, können Sie den aktuellen Ordner im Finder mithilfe von AppleScript als Zielordner auswählen.

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)
}
5
tim