2012-05-25 18 views
21

que tienen más de 700 archivos en una carpeta con nombre como: archivos del número 1 al number9 son nombrados por el primer mes:¿Cómo cambio el nombre de los archivos usando R?

water_200101_01.img 
water_200101_09.img 

archivos desde el número 10 a Número30 se nombran:

water_200101_10.img 
water_200101_30.img 

y así sucesivamente para el segundo mes: archivos desde el número 1 hasta number9 se denominan:

water_200102_01.img 
water_200102_09.img 

archivos de adormecer er 10 a Número30 se nombran:

water_200102_10.img 
water_200102_30.img 

¿Cómo puedo cambiar el nombre de ellos sin hacer ningún cambio en los archivos. basta con cambiar las nams, por ejemplo

water_1 
water_2 
...till... 
water_700 
+0

muy similar a http://stackoverflow.com/q/7864931/602276 – Andrie

Respuesta

31

file.rename va a cambiar el nombre de archivos, y puede tomar un vector de ambos from y to nombres.

Así que algo como:

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

podría funcionar.

Si le importa el orden específicamente, puede ordenar la lista de archivos que existen actualmente, o si siguen un patrón particular, simplemente cree el vector de nombres de archivo directamente (aunque observo que 700 no es un múltiplo de 30)

Dejaré de lado la pregunta, "¿por qué querrías?" ya que parece estar tirando información en el nombre del archivo, pero presumiblemente esa información también está contenida en otros lugares.

+4

Es difícil leer el error en los comentarios. Parece que 'dir2' contiene los nombres de los archivos a cambiar de nombre, por lo que debería ser el primer argumento para' file.rename' (en lugar de otra llamada 'list.files'). Y te falta un paréntesis de cierre al final de la llamada 'list.files' dentro de' file.rename' de todos modos. –

4

Escribí esto por mí mismo. Es rápido, permite expresiones regulares para buscar y reemplazar, y admite "ejecuciones de prueba".

Si se encuentra en un mac, puede usar applescript para seleccionar la carpeta actual en el Finder como una carpeta de destino.

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) 
} 
Cuestiones relacionadas