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
не предлагает эту функциональность.
dir
функция фактически упорядочена в лексикографическом порядке на основеесли вы просто используя 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])
получить структуру, которая имеет только информацию о папке