Saltar al contenido

MATLAB dir sin ‘.’ y ‘..’

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
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *