MATLAB Answers

how to use dir in subfolders?

76 views (last 30 days)
I am trying to search for all the xlsx files inside a folder that have many subfolders to search from. I realize matlab does not search inside subfolders. So I tried this:
>> addpath(genpath('D:/'))
>> savepath
>> dir *.xlsx
but it is not working, please advice on what I can do. I want to make a code that works for any folder that I put inside genpath(' '). Thanks!

Accepted Answer

Image Analyst
Image Analyst on 29 Jun 2016
See the attached demo.


Show 3 older comments
Image Analyst
Image Analyst on 30 Jun 2016
You're not even using folder in dir. Try replacing the last loop with this:
for k = 1 : numFolders
thisFolder = listOfFolderNames{k};
filePattern = fullfile(thisFolder, '*.xls*');
files = dir(filePattern);
if ~isempty(files)
for k2 = 1 : length(files)
fprintf('%s\n', fullfile(thisFolder, files(k2).name));
chlor thanks
chlor thanks on 1 Jul 2016
It works! :D I can't tell you how much I appreciate all of your help, thank you so so so much!!
Image Analyst
Image Analyst on 21 Apr 2019
Attached is a new script that works with the ** capability added in R2016b, which was released after our discussion above.
If you have R2016b or later, you should use this rather than the first script I gave in my Answer.

Sign in to comment.

More Answers (1)

Ba Mo
Ba Mo on 21 Apr 2019
i dont recommend adding folders to matlab's path, casually like this
as lots of users reported above, new versions of matlab support the following command dir('**/*.mat');
However, old versions of matlab don't support this
instead of writing a large code, inspect the structure field "isfield" and so on, you could just easily ask DOS (or the command prompt) to do it for you. the output from MS-DOS isn't formatted, so you need to split the one block string to separate lines
newline = char(10); %char(10) is the character for line-break, or "enter"
[~,all_mats] = system('dir /s /b *.xls'); %you can also simply write: !dir /s /b *.xls
all_mats = strsplit(all_mats,newline)';
all_mats(cellfun(@isempty,all_mats))=[]; %the last entry/line might be an empty cell. delete it.


Sign in to comment.