【问题标题】:Rename list of files by removing and substituting components通过删除和替换组件重命名文件列表
【发布时间】:2019-08-24 01:23:32
【问题描述】:

我正在尝试重命名文件夹中包含的很长的 .wav 文件列表。这些文件目前命名如下:

SNR_-10_ieee21m01.wav

SNR_-10_ieee21m02.wav

SNR_-10_ieee21m03.wav...等

我想删除“SNR_”和“ieee”,并用“m”代替下划线,这样它们的内容如下:

-10_21_01.wav

-10_21_02.wav

-10_21_03.wav....等

我首先尝试使用 'file.rename' 函数将 'm' 替换为 '_',但我什至无法正确完成第一步 - 它在R 控制台。

startingDir <- "C:/Users/Desktop/-10"

files <- list.files(startingDir,pattern="*.wav", full.names=T)
sapply(files,FUN=function(eachPath){
  file.rename(from=eachPath,to=sub(pattern="m",replacement="_",eachPath))
})

任何帮助将不胜感激。

【问题讨论】:

    标签: r rename


    【解决方案1】:

    您可以使用正则表达式来捕获 3 个感兴趣的数字,并使用它们来创建新文件名。

    这就是它的样子:

    # Your strings
    str <- c("SNR_-10_ieee21m01.wav", "SNR_-10_ieee21m02.wav")
    
    # Note the parenthesis to capture the 3 groups
    # and the use of \\1, \\2 and \\3 to insert them in the replacement
    fixed_str <- gsub(
       pattern = "SNR_(\\-?[0-9]+)_ieee([0-9]+)m([0-9]+)\\.wav$",
       replacement = "\\1_\\2_\\3.wav", 
       str)
    
    

    编辑:现在第一组捕获(可选)减号。

    然后将其应用于您的文件。您对apply 的使用很好,但我偏爱提供各种地图功能的purrr 包。 walkmap 类似,但不捕获结果。为它们的副作用运行函数很有用,例如rename_file

    rename_file <- function(fi) {
      new_fi <- gsub(pattern = "SNR_(\\-?[0-9]+)_ieee([0-9]+)m([0-9]+)\\.wav$", 
                       replacement = "\\1_\\2_\\3.wav",
                       fi)
      file.rename(from = fi, to = new_fi)
    }
    
    library("purrr")
    walk(files, rename_file)
    

    【讨论】:

    • 谢谢你,安托万萨克。这看起来正在做我想要的。但是,当我使用 'map(startingDir, rename_file)' 运行上述代码时,我会在控制台上看到 '[[1]] [1] FALSE' 读数,并且文件夹中设置为 'startingDir' 的文件仍然是相同的。知道我做错了什么吗?
    • 您想对每个文件应用rename_file,因此调用应该是map(files, rename_file),其中files 包含完整的文件名。
    • 使用 walk 而不是 map 将摆脱控制台输出。不过,您可能希望在 rename_file 中添加一些日志记录,以跟踪正在重命名的内容。
    • 我明白了。但是有没有一种方法可以将此重命名规则应用于当前保存在桌面上的整个文件文件夹,并使用更改后的名称创建一个新文件夹(或者实际上只是用现有文件夹中的新名称替换旧名称)?而不是单独输入每个当前文件名(如果我理解正确的话)......
    • 这就是list.files 的用途。我假设 files = list.files(...) 在您发布的代码中。如果您宁愿更改函数以获取目录路径,那也可以。您仍然需要在函数体中调用fi = list.files(path)。为了清楚起见,您不必一个一个地手动处理文件,我的回答并不建议这样做。
    猜你喜欢
    • 2017-04-01
    • 2015-03-09
    • 2014-07-07
    • 1970-01-01
    • 2016-10-08
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多