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?
댓글 수: 0
채택된 답변
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
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!
Image Analyst
2020년 10월 31일
추가 답변 (2개)
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
댓글 수: 0
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
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.
참고 항목
카테고리
Help Center 및 File Exchange에서 Search Path에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!