2012-05-25 97 views
21

我有一個文件夾中超過700個文件,命名爲: 文件從1號到number9被命名爲第一個月:如何使用R重命名文件?

water_200101_01.img 
water_200101_09.img 

文件從10號到number30被命名爲:

water_200101_10.img 
water_200101_30.img 

等第二個月:從1號到number9 文件被命名爲:從麻木

water_200102_01.img 
water_200102_09.img 

文件呃10 number30被命名爲:

water_200102_10.img 
water_200102_30.img 

如何重新命名他們無需對文件進行任何更改。只是改變了NAMS,例如

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

非常類似於http://stackoverflow.com/q/7864931/602276 – Andrie

回答

31

file.rename將重命名的文件,它可以採取兩種fromto名稱的載體。

因此,像:

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

可能會奏效。

如果特別關心訂單,您可以對當前存在的文件列表進行排序,或者如果它們遵循特定模式,則直接創建文件名向量(儘管我注意到700不是30的倍數)。

我會拋開這個問題,「你爲什麼想要?」因爲你似乎把信息扔在文件名中,但是大概這些信息也包含在其他地方。

+4

很難讀取評論中的錯誤。它看起來像'dir2'包含要重命名的文件的名稱,因此它應該是'file.rename'的第一個參數(而不是另一個'list.files'調用)。無論如何,你在'file.rename'裏面'list.files'調用的結尾丟失了一個右括號。 –

4

我爲自己寫了這個。它速度快,允許正則表達式查找和替換,並支持「試運行」。

如果您在Mac上,它可以使用applescript將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) 
}