web-dev-qa-db-fra.com

Comment renommer des fichiers à l'aide de R?

J'ai plus de 700 fichiers dans un dossier nommé comme: les fichiers du numéro 1 au numéro9 sont nommés pour le premier mois:

water_200101_01.img  
water_200101_09.img  

les fichiers du numéro 10 au numéro 30 sont nommés:

water_200101_10.img
water_200101_30.img

Et ainsi de suite pour le deuxième mois: les fichiers du numéro 1 au numéro9 sont nommés:

water_200102_01.img  
water_200102_09.img  

les fichiers du numéro 10 au numéro 30 sont nommés:

water_200102_10.img
water_200102_30.img 

Comment puis-je les renommer sans apporter de modifications aux fichiers. il suffit de changer les noms, par exemple

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

file.rename renommera les fichiers, et il peut prendre un vecteur des noms from et to.

Donc quelque chose comme:

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

pourrait fonctionner.

Si vous vous souciez de l'ordre en particulier, vous pouvez soit trier la liste des fichiers qui existent actuellement, soit s'ils suivent un modèle particulier, créer directement le vecteur des noms de fichiers (bien que je note que 700 n'est pas un multiple de 30).

Je vais mettre de côté la question "pourquoi voudriez-vous?" puisque vous semblez jeter des informations dans le nom de fichier, mais il est probable que ces informations sont également contenues ailleurs.

52
Brian Diggs

J'ai écrit ça pour moi. Il est rapide, permet la recherche et le remplacement d'expressions régulières et prend en charge les "essais".

Si vous êtes sur un Mac, il peut utiliser applescript pour sélectionner le dossier actuel dans le Finder comme dossier cible.

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