Как получить список каталогов в каталоге, например list.files(), но вместо этого "list.dirs()"
Это может быть очень простой вопрос для кого-то - я могу использовать list.files()
для получения списка файлов в заданном каталоге, но если я хочу получить список каталогов, как мне это сделать? Это как-то прямо передо мной в качестве опции в list.files()
?
Кроме того, я использую Windows, поэтому, если ответ заключается в том, чтобы выполнить команду Linux/unix, это не сработает для меня.
.NET, например, имеет метод Directory.GetFiles()
и отдельный Directory.GetDirectories()
метод, поэтому я решил, что R будет иметь аналогичную пару. Спасибо заранее.
Ответы
Ответ 1
Обновление: функция A list.dirs
была добавлена в базовый пакет в редакции 54353, которая была включена в выпуск R-2.13.0 в апреле 2011 года.
list.dirs(path = ".", full.names = TRUE, recursive = TRUE)
Итак, моя функция ниже была полезна всего несколько месяцев.:)
Я не мог найти базовую функцию R, чтобы сделать это, но было бы довольно легко написать собственное использование:
dir()[file.info(dir())$isdir]
Обновление: здесь функция (теперь исправлена для комментария Тимоти Джонса):
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))
}
Ответ 2
base
R теперь включает list.dirs
функцию, поэтому варианты с домашним валом больше не нужны.
Например:
list.dirs('.', recursive=FALSE)
Ответ 3
Просто обновить этот поток:
Я вижу, что в новой версии R (в настоящее время я использую 2.5.1) теперь есть функция list.dirs
, включенная в базовую установку:
list.dirs неявно имеет all.files = TRUE, а если рекурсивный = TRUE, ответ включает сам путь (при условии, что он является читаемым каталогом).
Ответ 4
list.dirs <- function(...) {
x <- dir(...)
x[file_test("-d", x)]
}
может быть полезным?
Как мы можем сделать это рекурсивно? (аргумент recursive
dir
разрушает эти функции, потому что он никогда не возвращает имена каталогов, только файлы в каждом каталоге и т.д.).
Ответ 5
Вы упомянули, что не хотите распространять команду Linux/UNIX, но я предполагаю, что ее оболочка будет удалена в команду Windows. В этом случае это сделало бы это:
shell("dir/ad/b", intern = TRUE)
и это будет рекурсивно:
shell("dir/ad/b/s", intern = TRUE)
Обычно я бы предпочел независимые от платформы решения других, но особенно для интерактивного использования, когда вы просто заинтересованы в получении ответа как можно проще и по возможности, это может быть меньше.
Ответ 6
Что-то вроде этого, попробуйте:
dir('.')[file.info(dir('.',full.names=T))$isdir]
Ответ 7
У меня была эта проблема некоторое время назад, и я использовал этот рекурсивный код для поиска всех каталогов. Возможно, это может быть полезно?
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
}