Solución:
Una solución sin bucles:
d=dir;
d=d(~ismember({d.name},{'.','..'}));
TL; DR
Desplácese hasta la parte inferior de mi respuesta para ver una función que enumera el contenido del directorio, excepto .
y ..
.
Respuesta detallada
los .
y ..
las entradas corresponden a la carpeta actual y la carpeta principal, respectivamente. En shells * nix, puede usar comandos como ls -lA
enumerar todo menos .
y ..
. Lamentablemente, MATLAB dir
no ofrece esta funcionalidad.
Sin embargo, no todo está perdido. Los elementos de la matriz de estructura de salida devueltos por dir
función están realmente ordenados en orden lexicográfico basado en el name
campo. Esto significa que, si su carpeta MATLAB actual contiene archivos / carpetas que comienzan con cualquier carácter del punto de código ASCII más pequeño que el punto completo (46, en decimal), entonces .
y ..
Willl no corresponden a los dos primeros elementos de esa matriz de estructura.
Aquí hay un ejemplo ilustrativo: si su carpeta MATLAB actual tiene la siguiente estructura (!hello
y 'world
ya sea archivos o carpetas),
.
├── !hello
└── 'world
entonces obtienes esto
>> f = dir;
>> for k = 1 : length(f), disp(f(k).name), end
!hello
'world
.
..
Por qué son .
y ..
no las dos primeras entradas, aquí? Porque tanto el signo de exclamación como la comilla simple tienen puntos de código más pequeños (33 y 39, en decimal, respectivamente) que el punto completo (46, en decimal).
Los remito a esta tabla ASCII para obtener una lista exhaustiva de los caracteres visibles que tienen un punto de código ASCII más pequeño que el punto completo; Sin embargo, tenga en cuenta que no todos son necesariamente caracteres de nombre de archivo legales.
Una costumbre dir
función que no enumera .
y ..
Justo después de invocar dir
, siempre puede deshacerse de las dos entradas ofensivas de la matriz de estructura antes de manipularla. Además, por conveniencia, si desea ahorrarse algunos gastos mentales, siempre puede escribir un dir
función que hace lo que quieres:
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) = [];
Prueba
Suponiendo la misma estructura de directorios que antes, obtienes lo siguiente:
>> f = dir2;
>> for k = 1 : length(f), disp(f(k).name), end
!hello
'world
Si solo estás usando dir
para obtener una lista de archivos y directorios, puede usar Matlab’s ls
función en su lugar. En los sistemas UNIX, esto solo devuelve la salida del shell ls
comando, que puede ser más rápido que llamar dir
. los .
y ..
Los directorios no se mostrarán (a menos que su shell esté configurado para hacerlo). Además, tenga en cuenta que el comportamiento de esta función es diferente entre los sistemas UNIX y Windows.
Si todavía quieres usar dir
, y prueba cada nombre de archivo explícitamente, como en su ejemplo, es una buena idea usar strcmp
(o una de sus relaciones) en lugar de ==
para comparar cadenas. Lo siguiente omitiría todos los archivos y carpetas ocultos en los sistemas UNIX:
listing = dir;
for i = 1:length(listing)
if ~strcmp(listing(i).name(1),'.')
% Do something
...
end
end