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

这可能是一个非常简单的问题 – 我可以使用list.files()来获取给定目录中的文件列表,但是如果我想获取目录列表,我该怎么做? 在list.files()内的选项是不是正好在我面前?

另外,我正在使用Windows,所以如果答案是shell到一些Linux / Unix命令,那对我来说不起作用。

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

更新: list.dirs函数被添加到版本54353中的基本包中,该版本已包含在2011年4月的R-2.13.0版本中。

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

所以我下面的function只有几个月有用。 🙂


我找不到一个基本的R函数来完成这个任务,但是使用下面的代码很容易:

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

更新:这是一个函数(现在纠正Timothy琼斯的评论):

 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)) } 

现在base R包含一个list.dirs函数 ,所以自制的变体不再是必需的。

例如:

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

只是为了更新这个线程:

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

list.dirs隐含地具有all.files = TRUE,并且如果recursive = TRUE,答案包括path本身(提供它是一个可读的目录)。

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

可能是有用的?

我们如何recursion地做到这一点? ( dirrecursive参数打破了这些function,因为它永远不会返回目录名称,只是每个目录内的文件等)。

你提到你不想掏出一个Linux / UNIX命令,但是我认为它可以发送到一个Windows命令。 在这种情况下,这将做到这一点:

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

这将recursion地做到这一点:

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

通常情况下,我倾向于独立于平台的解决scheme,尤其是对于交互式使用,您只需关心尽可能简单直接地获得答案,这可能不太方便。

这样的事情呢,试试看:

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

我有这个问题一会儿回来,并使用此recursion代码来查找所有目录。 也许这可以是有用的?

 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 }