Como obter todos os arquivos em um diretório específico no MATLAB?

Eu preciso obter todos esses arquivos em D:\dic e fazer um loop sobre eles para continuar processando individualmente.

O MATLAB suporta este tipo de operações?

Isso pode ser feito em outros scripts como PHP, Python …

Update: Dado que este post é bastante antigo, e eu modifiquei este utilitário muito para meu próprio uso durante esse tempo, eu pensei que deveria postar uma nova versão. Meu código mais recente pode ser encontrado no MathWorks File Exchange : dirPlus.m . Você também pode obter a fonte do GitHub .

Eu fiz uma série de melhorias. Agora, você tem opções para preceder o caminho completo ou retornar apenas o nome do arquivo (incorporado do Doresoom e Oz Radiano ) e aplicar um padrão de expressão regular aos nomes dos arquivos (incorporados por Peter D ). Além disso, adicionei a capacidade de aplicar uma function de validação a cada arquivo, permitindo que você os selecionasse com base em critérios diferentes de seus nomes (por exemplo, tamanho do arquivo, conteúdo, data de criação, etc.).


Observação: em versões mais recentes do MATLAB (R2016b e posterior), a function dir tem resources de pesquisa recursiva! Assim, você pode fazer isso para obter uma lista de todos os arquivos *.m em todas as subpastas da pasta atual:

 dirData = dir('**/*.m'); 

Código antigo: (para a posteridade)

Aqui está uma function que busca recursivamente através de todos os subdiretórios de um determinado diretório, coletando uma lista de todos os nomes de arquivo encontrados:

 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 

Depois de salvar a function acima em algum lugar no seu caminho MATLAB, você pode chamá-lo da seguinte maneira:

 fileList = getAllFiles('D:\dic'); 

Você está procurando por dir para retornar o conteúdo do diretório.

Para repetir os resultados, você pode simplesmente fazer o seguinte:

 dirlist = dir('.'); for i = 1:length(dirlist) dirlist(i) end 

Isso deve dar a você a saída no seguinte formato, por exemplo:

 name: 'my_file' date: '01-Jan-2010 12:00:00' bytes: 56 isdir: 0 datenum: [] 

Eu usei o código mencionado nesta ótima resposta e o expandi para suportar 2 parâmetros adicionais que eu precisava no meu caso. Os parâmetros são extensões de arquivo a serem filtradas e um sinalizador indicando se é necessário concatenar o caminho completo para o nome do arquivo ou não.

Espero que esteja claro o suficiente e alguém achará isso benéfico.

 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 

Exemplo para executar o código:

 fileList = getAllFiles(dirName, '*.xml', 0); %#0 is false obviously 

Você pode usar regexp ou strcmp para eliminar . e .. Ou você poderia usar o campo isdir se quiser apenas arquivos no diretório, não pastas.

 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 

ou combine as duas últimas linhas:

 filenames={list(~[list.isdir]).name}; 

Para uma lista de pastas no diretório excluindo. e ..

 dirnames={list([list.isdir]).name}; dirnames=dirnames(~(strcmp('.',dirnames)|strcmp('..',dirnames))); 

A partir desse ponto, você poderá lançar o código em um loop nested e continuar pesquisando cada subpasta até que seus nomes retornem uma célula vazia para cada subdiretório.

Essa resposta não responde diretamente à pergunta, mas pode ser uma boa solução fora da checkbox.

Eu virei a solução do gnovice, mas quero oferecer outra solução: Use o comando dependente do sistema do seu sistema operacional:

 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. 

Positivo:

  • Muito rápido (no meu caso, para um database de 18.000 arquivos no linux).
  • Você pode usar soluções bem testadas.
  • Você não precisa aprender ou reinventar uma nova syntax para selecionar arquivos *.wav .

Negativo:

  • Você não é independente do sistema.
  • Você confia em uma única string que pode ser difícil de analisar.

Eu não sei um método de function única para isso, mas você pode usar o genpath para genpath uma lista de subdiretórios . Esta lista é retornada como uma cadeia de diretórios delimitada por ponto-e-vírgula, então você terá que separá-la usando strread, ou seja,

dirlist = strread(genpath('/path/of/directory'),'%s','delimiter',';')

Se você não quiser include o diretório fornecido, remova a primeira input do dirlist , ou seja, dirlist(1)=[]; já que é sempre a primeira input.

Em seguida, obtenha a lista de arquivos em cada diretório com um dir loop.

 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 retorna o separador de diretório para a plataforma na qual o MATLAB está sendo executado.

Isso fornece uma lista de nomes de arquivos com caminhos completos no filenamelist da matriz de células. Não é a melhor solução, eu sei.

Esta é uma function útil para obter nomes de arquivos, com o formato especificado (geralmente .mat ) em uma pasta raiz!

  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 

No seu caso, você pode usar o seguinte trecho 🙂

 filenames = getFilenames('D:/dic/**'); for i = 1:numel(filenames) filename = filenames{i}; % do your job! end 

Com pouca modificação, mas abordagem quase semelhante para obter o caminho completo do arquivo de cada subpasta

 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