如何获取目录中的目录列表,如list.files(),而不是“list.dirs()”

时间:2011-01-20 16:32:21

标签: r directory

对于某人来说,这可能是一个非常简单的问题 - 我可以使用list.files()来获取给定目录中的文件列表,但是如果我想获取目录列表,我该怎么做?在list.files()内作为一个选项,它在我面前是不是以某种方式?

另外,我正在使用Windows,所以如果答案是针对某些Linux / unix命令,那对我来说无效。

例如,

.NET有一个Directory.GetFiles()方法和一个单独的Directory.GetDirectories() 方法,所以我认为R会有一个类似的对。提前谢谢。

7 个答案:

答案 0 :(得分:82)

更新:版本54353中的基本软件包添加了list.dirs功能,该功能包含在2011年4月的R-2.13.0版本中。

list.dirs(path = ".", full.names = TRUE, recursive = TRUE)

所以下面我的功能只用了几个月。 :)


我找不到基本的R函数来做这件事,但用自己编写自己很容易:

dir()[file.info(dir())$isdir]

更新:这是一个功能(现已更正Timothy Jones的评论):

list.dirs <- function(path=".", pattern=NULL, all.dirs=FALSE,
  full.names=FALSE, ignore.case=FALSE) {
  # use full.names=TRUE to pass to file.info
  all <- list.files(path, pattern, all.dirs,
           full.names=TRUE, recursive=FALSE, ignore.case)
  dirs <- all[file.info(all)$isdir]
  # determine whether to return full names or just dir names
  if(isTRUE(full.names))
    return(dirs)
  else
    return(basename(dirs))
}

答案 1 :(得分:23)

base R现在包含list.dirs function,因此不再需要自制的变体。

例如:

list.dirs('.', recursive=FALSE)

答案 2 :(得分:16)

只是为了更新这个帖子:

我看到在较新版本的R中(目前我正在使用2.5.1),现在基本安装中包含list.dirs函数:

  

list.dirs隐式包含all.files = TRUE,如果recursive = TRUE,   答案包括路径本身(前提是它是一个可读目录)。

答案 3 :(得分:8)

list.dirs <- function(...) {
    x <- dir(...)
    x[file_test("-d", x)]
}

可能有用吗?

我们如何以递归方式执行此操作? (recursive的{​​{1}}参数会破坏这些函数,因为它永远不会返回目录名,只返回每个目录中的文件等等。)。

答案 4 :(得分:2)

您提到您不希望使用Linux / UNIX命令,但我认为可以使用Windows命令。在这种情况下,这样做:

shell("dir/ad/b", intern = TRUE)

这将以递归方式执行:

shell("dir/ad/b/s", intern = TRUE)

通常我更喜欢这里其他人的平台无关解决方案,但特别是对于交互式使用,你只关心尽可能简单直接地得到答案,这可能会减少工作量。

答案 5 :(得分:2)

这样的事情,试一试:

dir('.')[file.info(dir('.',full.names=T))$isdir]

答案 6 :(得分:-1)

我有一段时间没遇到这个问题,并使用这个递归代码来查找所有目录。也许这可能有用吗?

list.dirs <- function(parent=".")   # recursively find directories
{
    if (length(parent)>1)           # work on first and then rest
        return(c(list.dirs(parent[1]), list.dirs(parent[-1])))
    else {                          # length(parent) == 1
        if (!is.dir(parent))
            return(NULL)            # not a directory, don't return anything
        child <- list.files(parent, full=TRUE)
        if (!any(is.dir(child)))
            return(parent)          # no directories below, return parent
        else 
            return(list.dirs(child))    # recurse
    }
}

is.dir <- function(x)    # helper function
{
    ret <- file.info(x)$isdir
    ret[is.na(ret)] <- FALSE
    ret
}