【问题标题】:renaming files inside Sub directory with R用R重命名子目录中的文件
【发布时间】:2018-07-07 15:00:07
【问题描述】:

例如,我想用 jpeg 文件重命名子目录中的所有 jpeg 文件以及子目录名称

WorkingDirectory/FolderA/ -> a.jpg
WorkingDirectory/FolderB/ -> a.jpg

想换成

WorkingDirectory/FolderA/ -> FolderA-a.jpg
WorkingDirectory/FolderB/ -> FolderB-a.jpg

到目前为止,我正在使用

old.names <- list.files(path = ".", pattern = "jpeg$", recursive = TRUE)

new.names <- old.names
new.names  = gsub("/", "-", new.names)
new.names  = gsub(".jpeg", "", new.names)

final <- data.frame(do.call(cbind,mget(c('old.names','new.names'))))

final$old.names  = gsub("", "", final$old.names)
final$new.names  = gsub("", "", final$new.names)
file.rename(final$old.names, paste0(final$new.names, ".jpeg"))

我可以重命名文件,但上面代码面临的问题是它将所有文件移动到工作目录中,因为它们应该保留在子目录中。

【问题讨论】:

    标签: r file path file-rename


    【解决方案1】:

    上面的例子似乎足够了:

    old.names <- list.files(path = ".", pattern = "jpeg$", recursive = TRUE)
    
    new.names <- old.names
    new.names <- gsub("/", "-", new.names)
    new.names <- file.path(dirname(old.names), new.names)
    
    file.rename(old.names, new.names)
    

    【讨论】:

    • 如果从WorkingDirectory 内部执行,我相信这将产生new.names"WorkingDirectory/FolderA/WorkingDirectory-FolderA-a.jpg",而不是"WorkingDirectory/FolderA/FolderA-a.jpg"
    • list.files 将列出 FolderA/a.jpg 如果WorkingDirectory 是他的工作目录,我假设
    • 是的,我同意,根据您给出的假设,您的解决方案工作得非常好;但是,如果您在 "WorkingDirectory" 之外运行脚本,这将不起作用。 TBH,我不清楚 OP 想要从哪个文件夹重命名文件。这就是为什么我给出的解决方案应该适用于任意子文件夹。
    • yap "WorkingDirectory" 是我的工作目录,这个也容易得多,我花了 4 个小时才弄清楚 > dirname 的重要性
    【解决方案2】:

    您将在示例代码中从 new.names 中删除文件夹名称。

    这应该可行:

    old.names <- list.files(path = ".", pattern = "jp[e]*g$", recursive = TRUE)
    old.names;
    #[1] "tmp/FolderA/a.jpg" "tmp/FolderB/b.jpg"
    
    new.names <- sapply(strsplit(old.names, "/"), function(x)
        sprintf("%s/%s",
            paste0(x[1:(length(x) - 1)], collapse = "/"),
            paste0(x[(length(x) - 1):length(x)], collapse = "-")));
    new.names;
    #[1] "tmp/FolderA/FolderA-a.jpg" "tmp/FolderB/FolderB-b.jpg"
    
    file.rename(old.names, new.names);
    

    解释:在"/"上拆分old.names,然后通过将第一个n-1条目与"/"(即文件夹)连接来构造new.names,然后添加通过连接最后一个文件夹生成的新文件名"-" 的名称和旧文件名。

    【讨论】:

      猜你喜欢
      • 2018-02-25
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 2022-09-30
      • 2010-09-19
      相关资源
      最近更新 更多