7

我有一个定义感兴趣的文件名的正则表达式。列出符合此条件的目录中所有文件的最佳方法是什么?

我的尝试是:

f = dir(DIR);
f = {f([f.isdir] == 0).name};
result = f(~cellfun(@isempty, regexpi(f, '.*(avi|mp4)')));

但是,我想知道是否有更快和/或更清洁的解决方案?

如果我只有一个可能的文件扩展名列表而不是正则表达式,是否可以简化它?

4

3 回答 3

13

从根本上说,你的方法就是我想要的。但是,您的代码行可以简化为(目录在正则表达式中丢失,在最终连接中为空单元格):

f = dir('C:\directory');
f = regexpi({f.name},'.*txt|.*pdf','match');
f = [f{:}];

另外,请注意该函数dir()接受通配符( *) 但不接受多个扩展名:

dir('C:\directory\*.avi')

这意味着您只能立即检索与扩展名匹配的文件,但是您必须循环获取扩展名的数量:

d   = 'C:\users\oleg\desktop';
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','')

where stris!dir *.txt *.pdf /Bevalc()捕获字符串的评估并textscan()解析它。

于 2013-05-25T19:19:17.657 回答
0

假设您有一个带有可能扩展名的元胞数组,例如exts = {'avi','mp4'}. 然后您可以执行以下操作

f = cellfun( @(x) dir( fullfile( DIR, ['*.',x] ) ), exts, 'UniformOuput', false ); 
result = [f{:}];
于 2013-05-25T19:08:04.970 回答
0

我的循环变体:

ext = [".doc",".docx",".rtf"];
f = [];
for e = ext
    f = [f;dir(char(strcat('**/*',e)))];
end
f = f([f.isdir] == 0);
于 2017-05-27T20:04:57.890 回答