8 ответов:
обновление: учитывая, что этот пост довольно старый, и я изменил эту утилиту много для моего собственного использования в течение этого времени, я решил опубликовать новую версию. Мой новый код можно найти на Обмен Файлами MathWorks:
dirPlus.m. Вы также можете получить источник GitHub.Я сделал ряд улучшений. Теперь он дает вам возможность добавить полный путь или вернуть только имя файла (включенное из Doresoom и Oz Radiano) и применить шаблон регулярного выражения к именам файлов (зарегистрирована с Питер Д'). Кроме того, я добавил возможность применять функцию проверки к каждому файлу, что позволяет выбирать их на основе критериев, отличных от их имен (т. е. размер файла, содержимое, дата создания и т. д.).
Примечание: в новых версиях 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');
вы ищете реж для возврата содержимого каталога.
чтобы зациклиться на результатах, вы можете просто сделать следующее:
dirlist = dir('.'); for i = 1:length(dirlist) dirlist(i) endЭто должно дать вам выход в следующем формате, например:
name: 'my_file' date: '01-Jan-2010 12:00:00' bytes: 56 isdir: 0 datenum: []
я использовал код, указанный в Это замечательный ответ и расширил его для поддержки 2 дополнительных параметров, которые мне нужны в моем случае. Параметры файла расширения для фильтрации и флаг, указывающий, следует ли объединить полный путь к имени файла или нет.
Я надеюсь, это достаточно ясно, и кто-то найдет его полезным.
function fileList = getAllFiles(dirName, fileExtension, appendFullPath) dirData = dir([dirName '/' fileExtension]); %# Get the data for the current directory dirWithSubFolders = dir(dirName); dirIndex = [dirWithSubFolders.isdir]; %# Find the index for directories fileList = {dirData.name}'; %'# Get a list of the files if ~isempty(fileList) if appendFullPath fileList = cellfun(@(x) fullfile(dirName,x),... %# Prepend path to files fileList,'UniformOutput',false); end end subDirs = {dirWithSubFolders(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, fileExtension, appendFullPath)]; %# Recursively call getAllFiles end endпример работы кода:
fileList = getAllFiles(dirName, '*.xml', 0); %#0 is false obviously
вы можете использовать регулярное выражение или strcmp для устранения
.и..Или вы могли бы использоватьisdirполе, если вы хотите только файлы в каталоге, а не папки.list=dir(pwd); %get info of files/folders in current directory isfile=~[list.isdir]; %determine index of files vs folders filenames={list(isfile).name}; %create cell array of file namesили объединить последние две строки:
filenames={list(~[list.isdir]).name};для списка папок в каталоге за исключением . и..
dirnames={list([list.isdir]).name}; dirnames=dirnames(~(strcmp('.',dirnames)|strcmp('..',dirnames)));С этого момента вы должны быть в состоянии бросить код во вложенный цикл for и продолжить поиск каждой подпапки, пока ваши имена dirnames не вернут пустую ячейку для каждый подкаталог.
этот ответ не дает прямого ответа на вопрос, но может быть хорошим решением вне коробки.
Я поддержал решение gnovice, но хочу предложить другое решение: используйте зависимую от системы команду вашей операционной системы:
tic asdfList = getAllFiles('../TIMIT_FULL/train'); toc % Elapsed time is 19.066170 seconds. tic [status,cmdout] = system('find ../TIMIT_FULL/train/ -iname "*.wav"'); C = strsplit(strtrim(cmdout)); toc % Elapsed time is 0.603163 seconds.плюсы:
- очень быстро (в моем случае для базы данных из 18000 файлов на linux).
- вы можете использовать хорошо проверенные решения.
- вам не нужно учиться или изобретать новый синтаксис для выбора, т. е.
*.wavфайлы.отрицательные:
- вы не независимы от системы.
- вы опираетесь на одну строку, которая может быть трудно разобрать.
Я не знаю метода одной функции для этого, но вы можете использовать
genpathдля рекурсии список подкаталоги только. Этот список возвращается в виде строки каталогов, разделенной точкой с запятой, поэтому вам придется разделить его с помощью strread, т. е.
dirlist = strread(genpath('/path/of/directory'),'%s','delimiter',';')если вы не хотите включать данный каталог, удалите первую запись
dirlist, т. е.dirlist(1)=[];так как это всегда первая запись.затем получить список файлов в каждой каталог с петлей
dir.filenamelist=[]; for d=1:length(dirlist) % keep only filenames filelist=dir(dirlist{d}); filelist={filelist.name}; % remove '.' and '..' entries filelist([strmatch('.',filelist,'exact');strmatch('..',filelist,'exact'))=[]; % or to ignore all hidden files, use filelist(strmatch('.',filelist))=[]; % prepend directory name to each filename entry, separated by filesep* for f=1:length(filelist) filelist{f}=[dirlist{d} filesep filelist{f}]; end filenamelist=[filenamelist filelist]; end
filesepвозвращает разделитель каталогов для платформы, на которой работает MATLAB.это дает вам список имен файлов с полными путями в массиве ячеек filenamelist. Не самое аккуратное решение, я знаю.
Это удобная функция для получения файлов с указанным форматом (обычно
.mat) в корневой папке!function filenames = getFilenames(rootDir, format) % Get filenames with specified `format` in given `foler` % % Parameters % ---------- % - rootDir: char vector % Target folder % - format: char vector = 'mat' % File foramt % default values if ~exist('format', 'var') format = 'mat'; end format = ['*.', format]; filenames = dir(fullfile(rootDir, format)); filenames = arrayfun(... @(x) fullfile(x.folder, x.name), ... filenames, ... 'UniformOutput', false ... ); endв вашем случае, вы можете использовать следующий фрагмент :)
filenames = getFilenames('D:/dic/**'); for i = 1:numel(filenames) filename = filenames{i}; % do your job! end
С небольшими изменениями, но почти аналогичный подход, чтобы получить полный путь к файлу каждой подпапки
dataFolderPath = 'UCR_TS_Archive_2015/'; dirData = dir(dataFolderPath); %# 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(dataFolderPath,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(dataFolderPath,subDirs{iDir}); %# Get the subdirectory path getAllFiles = dir(nextDir); for k = 1:1:size(getAllFiles,1) validFileIndex = ~ismember(getAllFiles(k,1).name,{'.','..'}); if(validFileIndex) filePathComplete = fullfile(nextDir,getAllFiles(k,1).name); fprintf('The Complete File Path: %s\n', filePathComplete); end end end
Comments