我在一个文件夹中有超过700个文件,命名为: 从1号到9号的文件以第一个月命名:
water_200101_01.img
water_200101_09.img
从10号到30号的文件命名为:
water_200101_10.img
water_200101_30.img
等第二个月: 数字1到数字9的文件命名为:
water_200102_01.img
water_200102_09.img
从10号到30号的文件命名为:
water_200102_10.img
water_200102_30.img
如何在不对文件进行任何更改的情况下重命名它们。只需更改nams,例如
water_1
water_2
...till...
water_700
答案 0 :(得分:46)
file.rename
会重命名文件,并且可以采用from
和to
名称的矢量。
类似于:
file.rename(list.files(pattern="water_*.img"), paste0("water_", 1:700))
可能有用。
如果特别关注订单,您可以对当前存在的文件列表进行排序,或者如果它们遵循特定模式,只需直接创建文件名向量(尽管我注意到700不是30的倍数)
我会抛开一个问题,“你为什么要这样做?”因为你似乎丢弃了文件名中的信息,但可能是信息也包含在其他地方。
答案 1 :(得分: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)
}
答案 2 :(得分:0)
如果要将文件名中与给定模式匹配的某个部分替换为另一个模式。这对于一次重命名多个文件很有用。例如,此代码将获取包含 foo 的所有文件,并将文件名中的 foo 替换为 bob。
file.rename(list.files(pattern = "foo"), str_replace(list.files(pattern = "foo"),pattern = "foo", "bob"))