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.

 51
Author: jbaums, 2011-01-20

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))
}
 70
Author: Joshua Ulrich, 2016-04-18 14:42:52

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)
 19
Author: jbaums, 2014-12-08 12:49:20

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

 16
Author: Tal Galili, 2014-12-12 05:29:11
list.dirs <- function(...) {
    x <- dir(...)
    x[file_test("-d", x)]
}

Pode ser útil?

Como podemos fazer isto recursivamente? (o argumento recursive de dir quebra estas funções porque nunca devolve os nomes das pastas, apenas os ficheiros dentro de cada pasta, etc...).
 8
Author: Gavin Simpson, 2011-01-20 17:41:48

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.
 2
Author: G. Grothendieck, 2011-01-20 22:49:56
Que tal uma coisa destas?
dir('.')[file.info(dir('.',full.names=T))$isdir]
 2
Author: FranciscoA, 2014-04-29 03:54:34

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
}
 -1
Author: David O, 2014-04-07 23:11:02