Como obter uma lista de diretórios dentro de um diretório, como a lista.files (), but instead "list.dirs()"
Esta pode ser uma pergunta muito fácil para alguém - eu sou capaz de usar list.files()
para obter uma lista de arquivos em um determinado diretório, mas se eu quiser obter uma lista de diretórios, como eu iria fazer isso? Está mesmo à minha frente como opção?
Também estou a usar o Windows, por isso, se a resposta for enviar para algum comando Linux/unix, isso não vai funcionar para mim.
. net por exemplo tem um método Directory.GetFiles()
, e um método separado Directory.GetDirectories()
método, então pensei que R teria um análogo par. Obrigado antecipadamente.
7 answers
Atualização: a função list.dirs
foi adicionada ao pacote base na revisão 54353, que foi incluída no lançamento R-2.13.0 em abril de 2011.
list.dirs(path = ".", full.names = TRUE, recursive = TRUE)
Então a minha função abaixo só foi útil por alguns meses. :)
Eu não conseguia encontrar uma função base R para fazer isto, mas seria muito fácil escrever a sua própria usando:
dir()[file.info(dir())$isdir]
Actualização: aqui está uma função (agora corrigida para o comentário de 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))
}
base
r inclui agora um list.dirs
Função , por isso as variantes caseiras já não são necessárias.
Por exemplo:
list.dirs('.', recursive=FALSE)
Só para actualizar este tópico:
Vejo que na versão mais recente de R (atualmente estou usando 2.5.1), existe agora uma função list.dirs
incluída na instalação base:
Lista.dirs implicitamente tem tudo.files = TRUE, and if recursive = TRUE, a resposta inclui o próprio caminho (desde que seja um diretório legível).
list.dirs <- function(...) {
x <- dir(...)
x[file_test("-d", x)]
}
Pode ser útil?
Como podemos fazer isto recursivamente? (o argumentorecursive
de dir
quebra estas funções porque nunca devolve os nomes das pastas, apenas os ficheiros dentro de cada pasta, etc...).
Você mencionou que não quer se conectar a um comando Linux/UNIX, mas eu assumo que está ok para se conectar a um comando Windows. Nesse caso, bastaria:
shell("dir/ad/b", intern = TRUE)
E isto fá-lo-ia recursivamente:
shell("dir/ad/b/s", intern = TRUE)
Normalmente eu preferiria soluções independentes de plataforma de outros aqui, mas particularmente para uso interativo quando você está apenas preocupado em obter a resposta tão simples e diretamente quanto possível isso pode ser menos trabalho.
dir('.')[file.info(dir('.',full.names=T))$isdir]
Tive este problema há algum tempo e usei este código recursivo para encontrar todas as pastas. Talvez isto possa ser útil?
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
}