Comment obtenir une liste de répertoires dans un répertoire, comme list.files (), mais plutôt «list.dirs ()»

Cela peut être une question très facile pour quelqu’un – je peux utiliser list.files() pour obtenir une liste de fichiers dans un répertoire donné, mais si je veux obtenir une liste de répertoires, comment ferais-je cela? Est-ce en quelque sorte juste en face de moi comme une option dans list.files() ?

Aussi, j’utilise Windows, donc si la solution consiste à utiliser certaines commandes Linux / Unix, cela ne fonctionnera pas pour moi.

Par exemple, .NET a une méthode Directory.GetFiles() et une méthode Directory.GetFiles() distincte. J’ai donc pensé que R aurait une paire analogue. Merci d’avance.

Mise à jour: Une fonction list.dirs été ajoutée au package de base dans la révision 54353, qui était incluse dans la version R-2.13.0 en avril 2011.

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

Donc, ma fonction ci-dessous n’était utile que pendant quelques mois. 🙂


Je ne pouvais pas trouver une fonction de base R pour faire cela, mais il serait assez facile d’écrire votre propre en utilisant:

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

Mise à jour: voici une fonction (maintenant corrigée pour le commentaire 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 inclut désormais une fonction list.dirs , de sorte que les variantes maison ne sont plus nécessaires.

Par exemple:

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

Juste pour mettre à jour ce fil:

Je vois que dans la nouvelle version de R (actuellement j’utilise 2.5.1), il y a maintenant une fonction list.dirs incluse dans l’installation de base:

list.dirs a implicitement all.files = TRUE, et si recursive = TRUE, la réponse inclut le chemin lui-même (à condition que ce soit un répertoire lisible).

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

pourrait être utile?

Comment pourrions-nous faire cela récursivement? (l'argument recursive de dir casse ces fonctions car il ne retourne jamais les noms de répertoires, juste les fichiers dans chaque répertoire, etc ...).

Vous mentionnez que vous ne voulez pas passer à une commande Linux / UNIX mais je suppose qu’il est possible de passer à une commande Windows. Dans ce cas, cela le ferait:

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

et cela le ferait récursivement:

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

Normalement, je préférerais les solutions indépendantes de la plate-forme des autres ici, mais en particulier pour une utilisation interactive où vous ne faites que trouver la réponse aussi simplement et directement que possible.

Qu’en est-il de quelque chose comme ça, essayez-le:

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

J’ai eu ce problème il y a quelque temps et j’ai utilisé ce code récursif pour trouver tous les répertoires. Peut-être que cela peut être utile?

 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 }