如何一次编辑多个文件名?

时间:2014-01-27 17:18:27

标签: linux r filenames

我的目录中包含.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 有谁知道如何在一个目录中为整个文件执行此操作?

4 个答案:

答案 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)