如何获取MATLAB中的特定目录下的所有文件?

我需要将所有这些文件都放在D:\dic然后遍历它们以进一步单独处理。

MATLAB支持这种操作吗?

它可以在PHP,Python等其他脚本中完成。

更新:鉴于这个post是相当古老的,我已经修改这个实用程序很多我自己在这段时间使用,我想我应该发布一个新的版本。 我可以在The MathWorks文件交换中find最新的代码: dirPlus.m 。 你也可以从GitHub获得源代码。

我做了一些改进。 现在,您可以select预先设置完整path或返回文件名(从Doresoom和Oz Radiano合并 ),并将正则expression式模式应用于文件名(由Peter D合并)。 另外,我添加了对每个文件应用validationfunction的function,允许您根据除了名称(即文件大小,内容,创builddate等)之外的标准来select它们。


注意:在较新版本的MATLAB(R2016b及更高版本)中, dir函数具有recursionsearchfunction! 所以你可以做到这一点,以获得当前文件夹的所有子文件夹中的所有*.m文件的列表:

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

旧代码:(后人)

下面是一个recursionsearch给定目录的所有子目录的函数,收集它find的所有文件名的列表:

 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 

在MATLABpath的某处保存上述函数后,可以通过以下方式调用它:

 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: [] 

我使用了这个很好的答案中提到的代码,并将其扩展为支持我需要的两个额外参数。 参数是要过滤的文件扩展名和一个标志,指示是否将完整path连接到文件的名称。

我希望这是清楚的,有人会发现它是有益的。

 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 

你可以使用regexp或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循环,并继续search每个子文件夹,直到你的dirnames为每个子目录返回一个空的单元格。

这个答案不直接回答这个问题,但可能是一个很好的解决scheme。

我upvoted gnovice的解决scheme,但要提供另一种解决scheme:使用系统依赖于您的操作系统的命令:

 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. 

正:

  • 非常快(在我的情况下,在Linux上的18000个文件的数据库)。
  • 您可以使用testing良好的解决scheme
  • 您不需要学习或重新创build新的语法来selectie *.wav文件。

负:

  • 你不是系统独立的。
  • 你依靠一个可能很难parsing的string。

我不知道这个单一函数的方法,但你可以使用genpath来recursion一个子目录的列表。 这个列表是以分号分隔的目录串返回的,所以你必须用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的平台的目录分隔符。

这给你一个单元格arrays文件名列表中具有完整path的文件名列表。 不是最好的解决办法,我知道。

这是一个方便的函数获取文件名,指定的格式(通常是.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