2012-05-25 51 views
21

Tôi có hơn 700 tập tin trong một thư mục có tên như: tập tin từ số 1 tới number9 được đặt tên cho tháng đầu tiên:Làm cách nào để đổi tên tệp bằng R?

water_200101_01.img 
water_200101_09.img 

tập tin từ số 10 đến number30 được đặt tên:

water_200101_10.img 
water_200101_30.img 

Và cứ tiếp tục cho tháng thứ hai: tệp từ số 1 đến số 9 có tên:

water_200102_01.img 
water_200102_09.img 

tệp từ tê liệt từ số 10 đến số 30 được đặt tên:

water_200102_10.img 
water_200102_30.img 

Làm cách nào để đổi tên chúng mà không thực hiện bất kỳ thay đổi nào đối với tệp. chỉ cần thay đổi Nams, ví dụ

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

Rất giống với http://stackoverflow.com/q/7864931/602276 – Andrie

Trả lời

31

file.rename sẽ đổi tên tập tin, và nó có thể mất một vector của cả fromto tên.

Vì vậy, một cái gì đó như:

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

có thể làm việc. Nếu quan tâm đến thứ tự cụ thể, bạn có thể sắp xếp danh sách các tệp hiện đang tồn tại hoặc nếu chúng tuân theo một mẫu cụ thể, chỉ cần tạo trực tiếp vectơ tên tệp (mặc dù tôi lưu ý rằng 700 không phải là bội số của 30).

Tôi sẽ đặt sang một bên câu hỏi, "tại sao bạn muốn?" vì bạn dường như đang ném đi thông tin trong tên tệp, nhưng có lẽ thông tin đó cũng được chứa ở nơi khác.

+4

Thật khó để đọc được lỗi trong nhận xét. Có vẻ như 'dir2' giữ tên của các tệp được đổi tên, do đó, nó phải là đối số đầu tiên cho' file.rename' (thay vì một lệnh 'list.files' khác). Và bạn đang thiếu dấu ngoặc đơn đóng ở cuối lệnh 'list.files' bên trong' file.rename'. –

4

Tôi đã tự viết bài này. Nó nhanh, cho phép regex tìm và thay thế, và hỗ trợ "chạy thử".

Nếu bạn đang sử dụng máy Mac, nó có thể sử dụng bản ghi chép để chọn thư mục hiện tại trong Trình tìm kiếm làm thư mục đích.

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) 
} 
Các vấn đề liên quan