MATLAB dir without '.' и.' .'

функции dir возвращает массив типа

.
..
Folder1
Folder2

и каждый раз, когда я должен избавиться от первых 2 элементов, с помощью таких методов, как:

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

и с вложенными циклами, это может привести к много повторяющегося кода.

итак, могу ли я избежать этих "папок" более простым способом?

Спасибо за любую помощь!

Edit:

в последнее время я занимаюсь этим вопросом более просто, как это :

for i=3:numel(folders)
    do_something(folders(i).name)
end

просто игнорируя первые два пункта.

но, обратите внимание на ответ @Jubobs. Будьте осторожны с именами папок, которые начинаются с неприятного символа, имеющего меньшее значение ASCII, чем .. Тогда второй метод потерпит неудачу. Кроме того, если он начинается с ., то первый метод не сработает :)

поэтому либо убедитесь, что у вас есть хорошие имена папок и используйте одно из моих простых решений, либо используйте решение @Jubobs, чтобы убедиться.

6 ответов


TL; DR

перейдите к нижней части моего ответа для функции, которая перечисляет содержимое каталога, кроме . и ...

подробный ответ!--26-->

на . и .. записи соответствуют текущей папке и родительской папке соответственно. В оболочках * nix вы можете использовать такие команды, как ls -lA перечислить все, кроме . и ... К сожалению, MATLAB dir не предлагает эту функциональность.

все не терять. Элементы выходного массива struct, возвращаемые dir функция фактически упорядочена в лексикографическом порядке на основе

решение без цикла:

d=dir;
d=d(~ismember({d.name},{'.','..'}));

если вы просто используя dir чтобы получить список файлов и каталогов, вы можете использовать ls вместо функции. В системах UNIX это просто возвращает вывод оболочки , который может быть быстрее, чем вызов dir. The . и .. каталоги не будут отображаться (если ваша оболочка не настроена для этого). Кроме того, обратите внимание, что поведение этой функции отличается между UNIX и Windows системный.

если вы все еще хотите использовать dir, и вы тестируете каждое имя файла явно, как в вашем примере, это хорошая идея использовать strcmp (или одно из его отношений) вместо == для сравнения строк. Следующее пропустит все скрытые файлы и папки в системах UNIX:

listing = dir;
for i = 1:length(listing)
    if ~strcmp(listing(i).name(1),'.')
        % Do something
        ...
    end
end

аналогичное решение из предложенного Tal:

listing = dir(directoryname);
listing(1:2)=[];   % here you erase these . and .. items from listing

Он имеет преимущество использовать очень распространенный трюк в Matlab, но предполагает, что вы знаете, что первые два элемента листинга. и.. (что вы и делаете в данном случае). В то время как решение, предоставленное Tal (которое я не пробовал, хотя), кажется, находит . и.. элементы, даже если они не размещены на первых двух позициях в листинге.

надеюсь, что это помогает ;)


вы также можете исключить любые другие файлы, кроме удаления точек

d = dir('/path/to/parent/folder')
d(1:2)=[]; % removing dots 
d = d([d.isdir])    % [d.isdir] returns a logical array of 1s representing folders and 0s for other entries

Я: a = dir(folderPath);

затем используется два коротких кода, которые возвращают struct:

my_isdir = a([a.isdir]) получить структуру, которая имеет только информацию о папке

my_notdir = a(~[a.isdir]) получить структуру, которая имеет только информацию о папке