How to create a loop that runs a function through subfolders in a directory?

조회 수: 195 (최근 30일)
Hello,
I currently have a folder with 11 subfolders in it. The subfolders have some text files, and I need to run a function through all the subfolders to extract the data from the text files. At the moment I am extracting the data one by one through each folder, because I can't figure out how to successfully do this with a loop. Any suggestions?

채택된 답변

Brendan Hamm
Brendan Hamm 2016년 7월 6일
편집: Stephen23 2018년 9월 9일
You can get the sub-directories using dir:
D = dir; % A is a struct ... first elements are '.' and '..' used for navigation.
for k = 3:length(D) % avoid using the first ones
currD = D(k).name; % Get the current subdirectory name
% Run your function. Note, I am not sure on how your function is written,
% but you may need some of the following
cd(currD) % change the directory (then cd('..') to get back)
fList = dir(currD); % Get the file list in the subdirectory
end
or you could use the struct as your looping variable:
for k = D
currD = k.name;
cd(currD)
end
  댓글 수: 6
Rosie
Rosie 2020년 10월 31일
@Guillaume can you clarify what you mean when you say "Also, I would avoid cd'ing into the directory. Just pass the path to the subfunction and use full paths for any I/O."? I'm not sure how to write that code within the loop structure. Thank you!

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Thorsten
Thorsten 2016년 7월 6일
You can run my function getfn to get all txt files in the current directory and all subdirectories. You can then work on the returned filenames.
fn = getfn(mkdir, 'txt$')
with getfn defined as
function filenames = getfn(mydir, pattern)
%GETFN Get filenames in directory and subdirectories.
%
% FILENAMES = GETFN(MYDIR, PATTERN)
%
% Example: Get all files that end with 'txt' in the current directory and
% all subdirectories
%
% fn = getfn(pwd, 'txt$')
%
% Thorsten.Hansen@psychol.uni-giessen.de 2016-07-06
if nargin == 0
mydir = pwd;
end
% computes common variable FILENAMES: get all files in MYDIR and
% recursively traverses subdirectories to get all files in these
% subdirectories:
getfnrec(mydir)
% if PATTERN is given, select only those files that match the PATTERN:
if nargin > 1
idx = ~cellfun(@isempty, regexp(filenames, pattern));
filenames = filenames(idx);
end
function getfnrec(mydir)
% nested function, works on common variable FILENAMES
% recursively traverses subdirectories and returns filenames
% with path relative to the top level directory
d = dir(mydir);
filenames = {d(~[d.isdir]).name};
filenames = strcat(mydir, filesep, filenames);
dirnames = {d([d.isdir]).name};
dirnames = setdiff(dirnames, {'.', '..'});
for i = 1:numel(dirnames)
fulldirname = [mydir filesep dirnames{i}];
filenames = [filenames, getfn(fulldirname)];
end
end % nested function
end

Image Analyst
Image Analyst 2016년 7월 6일
The easiest way to get subfolders is to use the built in function genpath(). No need to even worry about dot or dot dot. genpath() gives a cell array which is a list of all folders. Then use those folders with fullfile() and dir() to get the files in those folders, for example .dat or .xlsx files or whatever. See my attached demo for a demo.
  댓글 수: 3
Guillaume
Guillaume 2016년 7월 6일
"The easiest way to get subfolders is to use the built in function genpath"
With one big caveat: folders starting with + or @ or folders named private and any of their subfolders will not be returned.
genpath is not really designed for listing arbitrary path. It's only supposed to work for listing matlab toolbox folders.
It's probably ok for most use case, but of course, in three years the script is going to be used to generate that crucial report that would have won you the nobel prize if only it hadn't skipped over that folder named private.
Image Analyst
Image Analyst 2016년 7월 6일
Arantza, show the results of genpath().

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Search Path에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by