对于某人来说,这可能是一个非常简单的问题 - 我可以使用list.files()
来获取给定目录中的文件列表,但是如果我想获取目录列表,我该怎么做?在list.files()
内作为一个选项,它在我面前是不是以某种方式?
另外,我正在使用Windows,所以如果答案是针对某些Linux / unix命令,那对我来说无效。
例如, .NET有一个Directory.GetFiles()
方法和一个单独的Directory.GetDirectories()
方法,所以我认为R会有一个类似的对。提前谢谢。
答案 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)
答案 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
}