我的目录中包含.txt文件(2000个文件)。他们有很长的名字。我想编辑他们的名字,只是将他们名字中的某些字母作为文件名保留。 像这样:
UNCID_279113.TCGA-A6-2683-01A-01R-0821-07.100902_UNC7-RDR3001641_00025_FC_62EPOAAXX.1.trimmed.annotated.gene.quantification.txt
我想删除这个长名称,只保留从TCGA
开始并在三个-
之后结束的名称;例如,我的新文件名是:TCGA-A6-2683-01A
有谁知道如何在一个目录中为整个文件执行此操作?
答案 0 :(得分:4)
假设文件在当前目录中:
library(gsubfn)
pat <- "TCGA-[^-]*-[^-]*-[^-]*"
file.names <- dir(pattern = pat)
new.names <- strapplyc(file.names, pat, simplify = TRUE)
file.rename(file.names, new.names)
创建shell /批处理脚本以下是一个变体。它生成UNIX shell文件或Windows批处理文件。然后,您可以查看该文件并运行它:
# UNIX
writeLines(paste("mv", file.names, new.names), con = "tcga_rename.sh")
shell("tcga_rename.sh")
或在Windows上:
# Windows
writeLines(paste("rename", file.names, new.names), con = "tcga_rename.bat")
shell("tcga_rename.bat")
修订:考虑pat
,简化和添加变体。
答案 1 :(得分:3)
假设您的文件位于当前工作目录中,请尝试
library(stringr)
files <- list.files(".", pattern=".txt")
file.rename(files, str_extract(files, "TCGA(-\\w+){3}"))
答案 2 :(得分:1)
您可以这样做:
pattern <- ".*(TCGA-[^-]+-[^-]+-[^-]*).*"
file.rename(
list.files("."),
sub(pattern, "\\1", list.files("."))
)
但是要非常小心sub
命令执行你认为它将在你运行完整的东西之前做的事情(即只运行sub
篇幅)。如果不知道文件名中有哪些模式,很难确定这不会导致问题。
此外,在这种情况下,将list.files(".")
替换为您的目录。请注意,您不需要首先过滤我们与模式匹配的文件,因为sub
只会修改与模式匹配的文件名(如果您有很多文件,则不会超级高效) t匹配模式,但更容易编写,如果有问题,你可以像Greg Snow那样使用pattern
参数。)
答案 3 :(得分:1)
您可以使用list.files()
获取目录中的文件名列表,然后使用正则表达式替换来编辑名称,然后file.rename
实际重命名。
像(未经测试)的东西:
curfiles <- list.files(pattern='TCGA') # only grab files with TCGA in them
newfiles <- sub("^.*(TCGA-[a-zA-z0-9]+-[a-zA-Z0-9]+-[a-zA-Z0-9]+).*$", "\\1", curfiles)
file.rename(curfiles,newfiles)