我有一个正则表达式来定义感兴趣的文件名。列出目录中符合此条件的所有文件的最佳方法是什么?
我的尝试是:
f = dir(DIR);
f = {f([f.isdir] == 0).name};
result = f(~cellfun(@isempty, regexpi(f, '.*(avi|mp4)')));
然而,我想知道是否有更快和/或更干净的解决方案?
是否有可能简化它,如果不是正则表达式,我只有一个可能的文件扩展名列表?
基本上你的方法就是我想要的。但是,您的代码行可以将简化为(目录在regex中丢失,并在最终连接中丢失空单元格):
f = dir('C:directory');
f = regexpi({f.name},'.*txt|.*pdf','match');
f = [f{:}];
还要注意,函数dir()
接受通配符 (*
),但不接受多个扩展:
dir('C:directory*.avi')
这意味着您可以立即检索那些与扩展名匹配的文件,但是您必须循环以获取扩展名的数量:
d = 'C:usersolegdesktop';
ext = {'*.txt','*.pdf'};
f = [];
for e = 1:numel(ext)
f = [f; dir(fullfile(d,ext{e}))];
end
备选(不推荐)
ext = {'*.txt','*.pdf'};
str = ['!dir ' sprintf('%s ',ext{:}) '/B'];
textscan(evalc(str),'%s','Delimiter','')
其中str
为!dir *.txt *.pdf /B
, evalc()
捕获字符串的求值,textscan()
对其进行解析。
假设您有一个可能扩展的单元格数组,例如exts = {'avi','mp4'}
。然后可以执行以下操作
f = cellfun( @(x) dir( fullfile( DIR, ['*.',x] ) ), exts, 'UniformOuput', false );
result = [f{:}];
我的循环变量:
ext = [".doc",".docx",".rtf"];
f = [];
for e = ext
f = [f;dir(char(strcat('**/*',e)))];
end
f = f([f.isdir] == 0);