在R中列出符合完整路径模式的所有文件

32

我正在尝试获取与完整路径模式匹配的文件列表。到目前为止,我已经使用了list.files(),但它没有起作用。

假设我们有以下目录组织:

results
   |- A
   |  |- data-1.csv
   |  |- data-2.csv
   |
   |- B
      |- data-1.csv
      |- data-2.csv

那么以下命令:

list.files(pattern='data-.*\\.csv', recursive=TRUE)

将返回所有与模式匹配的文件。这很有效,但使用完整路径模式时会出现问题。例如,如果我想从目录results/A获取所有CSV文件,我可以这样做:

list.files(pattern='results/A/data-.*\\.csv', recursive=TRUE)

然而,这并不起作用。不知何故,似乎R无法将全路径模式用作正则表达式。在这种情况下,解决方案可能是只使用results/A作为基础路径。但在更复杂的问题中,这是不可行的。例如,某些时候我们可能希望匹配只包含字符的子目录:

list.files(pattern='results/[A-Z]+/data-.*\\.csv', recursive=TRUE)

在R语言中是否有可能做到这个?

更新:使用临时解决方案一段时间后,我决定停止重复相同的操作。因此,我创建了一个来简化这个任务。

4个回答

39

首先,请注意您没有使用正则表达式模式。您的第一个例子应该是:

list.files(pattern='data-.*\\.csv', recursive=TRUE)
然后,似乎list.files内部的模式匹配应用于文件基名(即不包括目录路径),因此您可以将任务分解为:

  1. 仅查找与基名匹配的所有文件,并返回它们的完整路径:

    basename.matches <- list.files(pattern='data-.*\\.csv', recursive=TRUE,
                                   full.names = TRUE)
    basename.matches
    # [1] "./results/A/data-1.csv" "./results/A/data-2.csv" "./results/B/data-1.csv"
    # [4] "./results/B/data-2.csv"
    
  2. 只保留与期望的目录匹配的内容:

  3. full.matches <- grep(pattern='^\\./results/A/', basename.matches, value = TRUE)
    full.matches
    # [1] "./results/A/data-1.csv" "./results/A/data-2.csv"
    

你是完全正确的。感谢你发现了这个问题。你的两步解决方案与我计划做的类似,如果像看起来的那样,在R中没有对完整路径模式的支持。然而,如果正则表达式指向绝对路径,list.files将无法工作。例如,'/tmp/[A-Z]+/data-.*\.csv'。我想我总是可以提取路径的开头'/tmp/',并将其用作list.files的'path'参数,但我想知道R是否已经提供了类似的东西。 - betabandido

7

仅使用list.files无法做到这一点,因为它会遍历path中的每个元素,并将正则表达式应用于其中包含的文件。但是由于list.filespath参数可以接受向量,您可以使用它来解决问题。

dirs <- grep("[A-Z]+$",list.dirs("results",recursive=FALSE),value=TRUE)
list.files(dirs, "data-.*\\.csv", recursive=TRUE, full.names=TRUE)

1

我将使用

paths <- list.files(results, pattern= glob2rx("*data-*.csv$*"), full.names=T, recursive=T)

1
我认为有一个更简单的解决方案:

Sys.glob(file.path(results, "[A-Z]", "data-*.csv"))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接