Мне нужно собрать все эти файлы D:\dic
и перебрать их для дальнейшей обработки индивидуально.
Поддерживает ли MATLAB такие операции?
Это можно сделать в других скриптах, таких как PHP, Python ...
Обновление: учитывая, что этот пост довольно старый, и я много модифицировал эту утилиту для собственного использования в течение того времени, я подумал, что должен опубликовать новую версию. Мой новейший код можно найти на The MathWorks Файл обмена : dirPlus.m
. Вы также можете получить исходный код с GitHub .
Сделал ряд улучшений. Теперь он дает вам возможность добавить полный путь или вернуть только имя файла ( взято из Doresoom и Oz Radiano ) и применить шаблон регулярного выражения к именам файлов (полученный из Peter D ). Кроме того, я добавил возможность применять функцию проверки к каждому файлу, что позволяет вам выбирать их на основе критериев, отличных от их имен (например, размер файла, содержимое, дата создания и т. Д.).
ПРИМЕЧАНИЕ. В более новых версиях MATLAB (R2016b и позже) dir
функция имеет возможности рекурсивного поиска! Таким образом, вы можете сделать это, чтобы получить список всех *.m
файлов во всех подпапках текущей папки:
dirData = dir('**/*.m');
Вот функция, которая рекурсивно выполняет поиск во всех подкаталогах данного каталога, собирая список всех имен файлов, которые она находит:
function fileList = getAllFiles(dirName)
dirData = dir(dirName); %# Get the data for the current directory
dirIndex = [dirData.isdir]; %# Find the index for directories
fileList = {dirData(~dirIndex).name}'; %'# Get a list of the files
if ~isempty(fileList)
fileList = cellfun(@(x) fullfile(dirName,x),... %# Prepend path to files
fileList,'UniformOutput',false);
end
subDirs = {dirData(dirIndex).name}; %# Get a list of the subdirectories
validIndex = ~ismember(subDirs,{'.','..'}); %# Find index of subdirectories
%# that are not '.' or '..'
for iDir = find(validIndex) %# Loop over valid subdirectories
nextDir = fullfile(dirName,subDirs{iDir}); %# Get the subdirectory path
fileList = [fileList; getAllFiles(nextDir)]; %# Recursively call getAllFiles
end
end
После сохранения вышеупомянутой функции где-нибудь на вашем пути к MATLAB вы можете вызвать ее следующим образом:
fileList = getAllFiles('D:\dic');
fileList = strcat(dirName,filesep,fileList);
вместо CELLFUN, хотя в результате вы можете получить лишние ненужные разделители файлов, о которых FULLFILE позаботится и за вас.if ~isempty(fileList) fileList = cellfun(@(x) fullfile(dirName,x),... %# Prepend path to files fileList,'UniformOutput',false); matchstart = regexp(fileList, pattern); fileList = fileList(~cellfun(@isempty, matchstart)); end
и измените подпись функции наgetAllFiles(dirName, pattern)
(также во второй и последней строке)Вы ищете реж вернуть содержимое каталога.
Чтобы просмотреть результаты, вы можете просто сделать следующее:
Это должно дать вам вывод в следующем формате, например:
источник
.
и..
?dir('*.ext')
, что автоматически исключает каталоги (если они, конечно, не заканчиваются на .ext)Я использовал код, упомянутый в этом замечательном ответе, и расширил его для поддержки 2 дополнительных параметров, которые мне нужны в моем случае. Параметры - это расширения файлов для фильтрации и флаг, указывающий, следует ли объединять полный путь с именем файла или нет.
Я надеюсь, что это достаточно ясно и кому-то будет полезно.
Пример запуска кода:
источник
Вы можете использовать regexp или strcmp для исключения
.
и..
или вы можете использоватьisdir
поле, если вам нужны только файлы в каталоге, а не папки.или объедините две последние строчки:
Для списка папок в каталоге исключая. и ..
С этого момента вы должны иметь возможность вставлять код во вложенный цикл for и продолжать поиск в каждой подпапке, пока ваши dirnames не вернут пустую ячейку для каждого подкаталога.
источник
Этот ответ не дает прямого ответа на вопрос, но может быть хорошим нестандартным решением.
Я поддержал решение gnovice, но хочу предложить другое решение: используйте системно-зависимую команду вашей операционной системы:
Положительный:
*.wav
файлов, т.е.Отрицательный:
источник
Я не знаю однофункционального метода для этого, но вы можете использовать только
genpath
для рекурсии списка подкаталогов . Этот список возвращается в виде строки каталогов, разделенных точкой с запятой, поэтому вам придется разделить его с помощью strread, т.е.dirlist = strread(genpath('/path/of/directory'),'%s','delimiter',';')
Если вы не хотите включать данный каталог, удалите первую запись
dirlist
, т. Е.dirlist(1)=[];
Поскольку это всегда первая запись.Затем получите список файлов в каждом каталоге с помощью цикла
dir
.filesep
возвращает разделитель каталогов для платформы, на которой работает MATLAB.Это дает вам список имен файлов с полными путями в массиве ячеек filenamelist . Я знаю, что не самое лучшее решение.
источник
genpath
этого, по сути, он выполняет поиск дважды.private
, они не будут включены.Это удобная функция для получения имен файлов в указанном формате (обычно
.mat
) в корневой папке!В вашем случае вы можете использовать следующий фрагмент :)
источник
С небольшими изменениями, но почти схожим подходом для получения полного пути к каждой подпапке
источник