список подпапок в папке - Matlab (только подпапки, а не файлы)

Мне нужно перечислить подпапки внутри папки с помощью Matlab. Если я использую

nameFolds = dir(pathFolder), 

Я получаю . и .. + имена подпапок. Затем мне нужно запустить nameFolds(1) = [] дважды. Есть ли лучший способ получить имена подпапок с помощью Matlab? Спасибо.


person Maddy    schedule 05.01.2012    source источник


Ответы (4)


Используйте поле isdir вывода dir для разделения подкаталогов и файлов:

d = dir(pathFolder);
isub = [d(:).isdir]; %# returns logical vector
nameFolds = {d(isub).name}';

Затем вы можете удалить . и ..

nameFolds(ismember(nameFolds,{'.','..'})) = [];

Вы не должны делать nameFolds(1:2) = [], так как вывод dir из корневого каталога не содержит этих папок с точками. По крайней мере, в Windows.

person yuk    schedule 05.01.2012
comment
Если вы хотите включить все скрытые подкаталоги (например, если вы работаете с git), вы можете использовать startsWith(nameFolds, '.') вместо ismember(nameFolds,{'.','..'}). - person dopexxx; 28.10.2018

Это намного приятнее и все в одну строку:

dirs = regexp(genpath(parentdir),['[^;]*'],'match');

Объяснение: genpath() — это команда, которая выводит все подпапки parentdir в одну строку текста, разделенную точкой с запятой. Функция регулярного выражения regexp() ищет шаблоны в этой строке и возвращает параметр: «соответствует» шаблону. В этом случае шаблон представляет собой любой символ, кроме точки с запятой = `[^;], повторяющийся один или несколько раз подряд = *. Так что это будет искать строку и группировать все символы, которые не являются точками с запятой, в отдельные выходные данные - в этом случае все каталоги подпапок.

person theLtran    schedule 27.09.2013
comment
Эта команда перечисляет основную папку, а также подпапки — это не то, что хотел автор запроса. - person ioanwigmore; 21.10.2013
comment
Этот ответ помог мне быстро перечислить все подкаталоги. Спасибо. - person axs; 25.02.2014
comment
Очень красивое решение! Но вы должны помнить, что функция genpath предназначена для генерации пути поиска, поэтому она пропускает некоторые определенные папки. См. документ. - person yuk; 20.05.2014
comment
Кроме того, вам нужно использовать pathsep вместо точки с запятой жесткого кодирования, поскольку разделитель пути в Unix отличается от Windows. - person Andy Campbell; 06.07.2018

Следующий фрагмент кода просто возвращает имена подпапок.

% `rootDir` is given
dirs = dir(rootDir);
% remove `.` and `..`
dirs(1:2) = [];
% select just directories not files
dirs = dirs([obj.dirs.isdir]);
% select name of directories
dirs = {dirs.name};
person Yas    schedule 11.04.2017

И чтобы эффективно повторно использовать первое решение, предоставленное в другом сценарии, я сделал из него функцию:

function [ dirList ] = get_directory_names( dir_name )

    %get_directory_names; this function outputs a cell with directory names (as
    %strings), given a certain dir name (string)
    %from: http://stackoverflow.com/questions/8748976/list-the-subfolders-
    %in-a-folder-matlab-only-subfolders-not-files

    dd = dir(dir_name);
    isub = [dd(:).isdir]; %# returns logical vector
    dirList = {dd(isub).name}';
    dirList(ismember(dirList,{'.','..'})) = [];

end
person Matthijs Noordzij    schedule 10.05.2017