dir()/ find()过滤掉隐藏文件

时间:2013-02-07 05:11:02

标签: matlab octave

我有一个脚本,它查看给定目录并抓取所有要处理的文件。 问题是我希望它忽略任何隐藏的(。)文件。我在thisthis这样的其他帖子中看到了很多方法,但是我的情况很简单,我认为值得一提,因为我是八音新人。值得一提的是第二个链接很简单,但似乎很奇怪我必须使用for循环来过滤...

这是我的代码:

dirname = strcat(pwd, '/fileset');
files = dir(dirname);
fileidx = find(~[files.isdir]);

for i = 1:length(fileidx)
    filename = [dirname, '/', files(fileidx(i)).name];
    fid = fopen(filename, 'r');
end

1 个答案:

答案 0 :(得分:2)

我曾承诺为第一行“更多的爱”......“那个没有用的”。在这里。

在我研究这个答案之前,有一些有趣的方法来操纵我不知道的单元格阵列...特别是cellfun()的使用。我将分享我学到的东西。

例如,当您有一个文件名的单元格数组

fnames = {files.name};

您可以应用正则表达式查找符合特定条件的文件(例如“不以点开头”)

crit = '^[^.]+';

% return cell array of results, [] if no match
rxResult = regexp( fnames, crit ); 

% loop over all cells, set true if regex matched
nodot = (cellfun('isempty', rxResult)==0); 

% The `nodot` array is a logical array telling us which are "good" files. 
totalGoodFiles = sum(nodot);

现在你可以使用

fileidx = find(~[files.isdir] & nodot);

另一方面,您已经使用for循环,因此您可以将测试放在那里(编辑为包含文件计数):

fCount=0;
for i = 1:length(fileidx)
if( files(fileidx(i)).name(1) ~= '.')
      filename = [dirname, '/', files(fileidx(i)).name];
      fCount = fCount+ 1;
      fid = fopen(filename, 'r');
    end
end

顺便说一下,有一个函数fullfile()可以用来连接目录和文件名;它了解用于您的操作系统的正确文件分隔符。非常方便 - 比连接'/'更好。当您尝试在Mac上运行时,它将失败...

进一步 - 内置常量filesep将返回正确的文件路径分隔符以在您的平台上使用;有利于使您的代码可移植。

相关问题