web-dev-qa-db-fra.com

Comment obtenir une liste de répertoires dans un répertoire, comme list.files (), mais à la place "list.dirs ()"

Cela peut être une question très simple 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 dois-je faire? Est-il en quelque sorte juste devant moi en tant qu'option dans list.files()?

De plus, j'utilise Windows, donc si la réponse est de décortiquer une commande Linux/unix, cela ne fonctionnera pas pour moi.

.NET par exemple a une méthode Directory.GetFiles(), et une méthode Directory.GetDirectories() distincte, donc j'ai pensé que R aurait une paire analogue. Merci d'avance.

62
user297400

Mise à jour: A list.dirs La fonction a été ajoutée au package de base dans la révision 54353, qui a été 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'a été utile que pendant quelques mois. :)


Je n'ai pas trouvé de fonction R de base pour le faire, mais il serait assez facile d'écrire la vôtre 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))
}
88
Joshua Ulrich

base R inclut désormais un list.dirs function , donc les variantes maison ne sont plus nécessaires.

Par exemple:

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

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 un list.dirs fonction incluse dans l'installation de base:

list.dirs a implicitement all.files = TRUE, et si récursif = TRUE, la réponse inclut le chemin lui-même (à condition qu'il s'agisse d'un répertoire lisible).

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

pourrait être utile?

Comment pourrions-nous procéder de manière récursive? (l'argument recursive de dir casse ces fonctions car il ne retourne jamais les noms de répertoire, juste les fichiers de chaque répertoire, etc ...).

8
Gavin Simpson

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

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

Vous mentionnez que vous ne voulez pas décortiquer vers une commande Linux/UNIX mais je suppose que c'est ok pour décortiquer vers une commande Windows. Dans ce cas, cela suffirait:

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 d'autres ici, mais en particulier pour une utilisation interactive où vous souhaitez simplement obtenir la réponse aussi simplement et directement que possible, cela peut être moins de travail.

2
G. Grothendieck