MATLAB目录没有'.' 和'..'

jef*_*eff 22 matlab dir

该函数dir返回一个数组

.
..
Folder1
Folder2
Run Code Online (Sandbox Code Playgroud)

每次我必须摆脱前两个项目,方法如下:

for i=1:numel(folders)
    foldername = folders(i).name;
    if foldername(1) == '.' % do nothing
            continue;
    end
    do_something(foldername)
end
Run Code Online (Sandbox Code Playgroud)

并且使用嵌套循环可能会导致大量重复的代码.

那么我可以通过更简单的方式避免这些"文件夹"吗?

谢谢你的帮助!

编辑:

最近我更简单地处理这个问题,像这样:

for i=3:numel(folders)
    do_something(folders(i).name)
end
Run Code Online (Sandbox Code Playgroud)

简单地忽略前两项.

但请注意@Jubobs的回答.请注意以ASCII值小于令人讨厌的字符开头的文件夹名称..然后第二种方法将失败.此外,如果它以a开头.,那么第一种方法将失败:)

所以要么确保你有一个很好的文件夹名称,并使用我的一个简单的解决方案,或使用@Jubobs的解决方案来确保.

Tri*_*een 40

无环路解决方案:

d=dir;
d=d(~ismember({d.name},{'.','..'}));
Run Code Online (Sandbox Code Playgroud)


jub*_*0bs 15

TL; DR

滚动到我的答案的底部,找到一个列出除.和之外的目录内容的函数...

详细的答案

...条目分别对应于当前文件夹和父文件夹.在*nix shell中,您可以使用命令ls -lA来列出除.和之外的所有内容...遗憾的是,MATLAB dir不提供此功能.

但是,一切都不会丢失.函数返回的输出结构数组的元素dir实际上是根据name字段按字典顺序排序的.这意味着,如果当前MATLAB文件夹中包含的文件/文件夹,通过ASCII代码点比句号较小的任何字符开始(46,十进制),然后...预订购对应于结构体数组的前两个元素.

下面是一个说明性示例:如果您当前的MATLAB文件夹具有以下结构(!hello并且'world是文件或文件夹),

.
??? !hello
??? 'world
Run Code Online (Sandbox Code Playgroud)

然后你明白了

>> f = dir;
>> for k = 1 : length(f), disp(f(k).name), end
!hello
'world
.
..
Run Code Online (Sandbox Code Playgroud)

这是为什么...不是前两个条目?因为感叹号和单引号都有较小的代码点(33和39,十进制,分别),而不是句号(46,十进制).

我将您引用到此ASCII表,以获得ASCII码点小于句号的可见字符的详尽列表; 请注意,并非所有这些都必须是合法的文件名字符.

一个dir没有列出.和的自定义函数..

在调用之后dir,您可以在操作之前始终从struct数组中删除两个有问题的条目.此外,为了方便起见,如果你想节省一些心理开销,你总是可以编写一个自定义dir函数来做你想要的:

function listing = dir2(varargin)

if nargin == 0
    name = '.';
elseif nargin == 1
    name = varargin{1};
else
    error('Too many input arguments.')
end

listing = dir(name);

inds = [];
n    = 0;
k    = 1;

while n < 2 && k <= length(listing)
    if any(strcmp(listing(k).name, {'.', '..'}))
        inds(end + 1) = k;
        n = n + 1;
    end
    k = k + 1;
end

listing(inds) = [];
Run Code Online (Sandbox Code Playgroud)

测试

假设与以前相同的目录结构,您将获得以下内容:

>> f = dir2;
>> for k = 1 : length(f), disp(f(k).name), end
!hello
'world
Run Code Online (Sandbox Code Playgroud)

  • `if any(strcmp(listing(k).name,{'.','..'}))`看起来更短更整洁.但它也是如此. (4认同)
  • @glglgl我没有参考,但我会找一个.根据我的经验,`.`和`..`一直是struct数组的前两个元素. (2认同)
  • @Jubobs - 从我在'dir`处理的内容来看,它们似乎总是前两个元素.BTW +1. (2认同)
  • 在OS X上肯定是这样.在大多数情况下,使用这些其他字符作为文件或文件夹的前缀可能是个坏主意.然而,特别是与Matlab相关的一个地方是针对面向对象编程的包.`+`字符用于[前缀包文件夹](http://www.mathworks.com/help/matlab/matlab_oop/scoping-classes-with-packages.html#brf3g8k).对于`.`,`+`字符的十进制值是43而46. (2认同)