2010-04-16 8 views
10
opendir MYDIR, "$dir"; 
    my @FILES = readdir MYDIR; 
    closedir MYDIR; 

Parece que el 99,9% de las veces las dos primeras entradas de la matriz son siempre “” y “..”. La lógica posterior en el script tiene problemas si no es verdad. Me encontré con un caso donde las entradas del directorio aparecieron más tarde. ¿Esto es indicativo de que el sistema de archivos está dañado o algo más? ¿Hay un orden conocido de lo que vuelve a operar?En caso de que el opendir de Perl siempre regrese. y ... primero?

Respuesta

21

Es siempre el orden del sistema operativo, sin ordenar presentó prima.

Mientras. y ... a menudo son las dos primeras entradas, eso es porque fueron las dos primeras entradas creadas. Si por alguna razón, uno de ellos se suprimieron (a través de secuencias no naturales, ya que está normalmente impedido), el siguiente fsck (o equivalente) habría fijar el directorio de tener tanto una vez más. Esto colocaría uno de los nombres en un lugar posterior en la lista.

Por lo tanto, no sólo "saltar las dos primeras entradas". En cambio, haga coincidirlos explícitamente para rechazarlos.

+0

¿Cómo se eliminarían exactamente? ¿Puedes describir una de esas secuencias antinaturales? – ojblass

+2

Creo que quiere decir que algo tiene que salir mal, ya que normalmente se previene. Si un fsck lo arregla, eso implica corrupción para mí. Una instancia en la que puedo imaginar dónde podría ocurrir esto es dónde se elimina o se pierde un directorio padre, y sus contenidos no fueron (corrupción o operación fallida). Si fue restaurado en un fsck, eso resultaría en una colocación posterior de ".." en sus subdirectorios, me imagino. – kbenson

+0

Hay sistemas de archivos que no almacenan entradas de directorio en una lista ordenada, y que no devuelven '.' y' ..' en ninguna posición particular bajo operación normal. Por ejemplo, ext3/ext4 con B-trees habilitado, que se usa en las instalaciones Linux más recientes. – Gilles

8

El orden es hacia abajo para el sistema operativo y no se define explícitamente lo contrario.

Son lo suficientemente fáciles de filtrar.

opendir MYDIR, "$dir"; 
    my @FILES = grep !/^\.\.?$/, readdir MYDIR ; 
    closedir MYDIR; 
+4

que cambiaría su expresión regular para eadability betterr un poco: 'mis @FILES = grep/^ {1,2} $ /, readdir MYDIR;' – DVK

+3

@DVK hecho, me gusta^'[! [.] [.]. ]? \ z', pero entonces soy así de raro. Solo asegúrate de anclar al final de la cadena usando '\ z' no' $ '. –

+5

Sí ... tenga en cuenta que '/^\.\.?$/' también coincide con ".. \ n", que * es * un nombre legal que usted * no * desea omitir. –

Cuestiones relacionadas