目录中的 data.000X 格式(其中X = 1,2,3 ......)中有一些.fcs个文件。
我想将每个 n 文件重命名为以下格式: exp.fcs (其中 exp 是来自矢量的文本)要重命名的文件是 .fcs 文件。
换句话说:我想将文件重命名为exp.txt,其中<em> exp 是一个文本,而不是一个连续的字母,即F,cA,K等等。
例如,来自:
data.0001, data.0002, data.0003, data.0004, data.0005, data.0006...
到
textF_a.fcs, textF_b.fcs, textF_c.fcs, textVv_a.fcs, textVv_b.fcs, textVv_c.fcs ...
我尝试用file.rename(from, to)做但由于参数的长度不同而失败(我不知道它的含义):
a <- list.files(path = ".", pattern = "data.*$")
b <- paste("data", 1:1180, ".fcs", sep = "")
file.rename(a, b)
答案 0 :(得分:4)
您的代码在我的机器上“正常工作”(在我创建一组文件并按照您的程序进行重命名时,“工作”)。错误可能是您拥有的文件数(length(a)
)与您提供的新名称数(length(b)
)不同。如果事实证明这些对象具有相同的长度,则回发。
答案 1 :(得分:4)
根据您的评论,一个问题是您的第一个文件未命名为“data.001” - 它的名称为“data.1”。使用此:
b <- sprintf("data%.4d.fcs", seq(a))
它最多可以预设3 0(因为看起来你有1000多个文件,这可能会更好),因为索引&lt; 1000,这样所有名称都具有相同的宽度。如果您真的只想看到“data.001”之类的内容,请在命令中使用%.3d
。
答案 2 :(得分:1)
与(非常相似)问题here一样,此功能可能对您有用。我写它是为了允许在R中使用正则表达式查找和替换。如果你在mac上,它可以检测并使用最前面的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)
}