¿Cuál es el "orden de directorio" de los archivos en un directorio (usado por `ls -U`)?

19

Según la página del manual para ls, ls -Usignifica:

no ordenar Listar entradas en orden de directorio.

¿Qué significa "orden de directorio" y cómo se determina?

La siguiente prueba (ejecutada en un sistema de archivos ext3) muestra que no es el orden en que se crearon los archivos:

root@sv1010vm0007:/tmp# mkdir test
root@sv1010vm0007:/tmp# touch test/2
root@sv1010vm0007:/tmp# touch test/1
root@sv1010vm0007:/tmp# touch test/3
root@sv1010vm0007:/tmp# ls -U test
2  3  1
Stefan
fuente

Respuestas:

14

Depende del sistema de archivos. Para algunos sistemas de archivos (ext3 entre ellos), un directorio es en realidad un archivo con un formato bien conocido, y el bit 'd' se establece en sus permisos o modo. En ese caso, puede importar el historial de la longitud de los nombres de archivo creados y eliminados. El núcleo completará la primera entrada en el archivo de directorio que tenga espacio suficiente para contener el nombre del nuevo archivo. Consulte http://e2fsprogs.sourceforge.net/ext2intro.html para obtener más detalles, la sección titulada "Descripción física".

Para algunos otros sistemas de archivos, entre ellos Reiserfs, un directorio es en realidad solo algunas entradas en un árbol B + que no es visible en el sistema de archivos, por lo que lsun directorio en un sistema de archivos Reiserfs está en orden léxico.

Bruce Ediger
fuente
@Bruce: Entonces, ¿cuáles son exactamente los contenidos de este archivo de "directorio"?
Faheem Mitha
Tradicionalmente, algo muy parecido a struct dirent, que encuentro definido en /usr/include/bits/dirent.h en un cuadro RHEL y en un cuadro Slackware 11.0. Ambas máquinas se niegan a abrir () un directorio directamente. Sé que solía hacer cosas como "cat.> Dot.as.file" para convertir un directorio en un archivo normal, creo que la última vez que lo hice con seguridad fue Solaris 8. Básicamente, struct dirent contiene un inodo (un número), una longitud de registro, una longitud de nombre y una cadena, que según recuerdo, puede o no estar terminada en ASCII-Nul.
Bruce Ediger
@Bruce: Ok. ¿Y esta estructura C logra obtener toda la información sobre los archivos y subdirectorios que contiene en esos campos?
Faheem Mitha
Un directorio en sistemas de archivos como ext2, BSD FFS o el sistema de archivos original de Unix, solo contenía una lista de números de inodo y los nombres de archivo correspondientes. Invocar "ls" sin argumentos acaba de obtener una lista de nombres de archivo. Si hiciste "ls -l", "ls" buscaría cada nombre de archivo haciendo una llamada al sistema stat (2) en el nombre del archivo, y de la estructura stat, obtendría permisos, tamaño, "tipo de archivo", etc. Entonces, no, un archivo de directorio no tiene toda la información, solo una lista de nombres.
Bruce Ediger
2
ext2.sourceforge.net/2005-ols/paper-html/node3.html explica que la función dir_index codifica el nombre del archivo y un secreto específico del sistema de archivos. dump2efs incluye dir_index en su línea de características del sistema de archivos si la característica está habilitada.
Martin Dorey
3

De hecho, no hay un orden específico que esperar. Depende de la implementación del sistema operativo y del sistema de archivos ordenar las entradas de la manera que desee. Un objetivo de esta opción es obtener el listado más rápido posible, lo que puede ser un factor significativo con directorios muy grandes.

jlliagre
fuente
Hay algoritmos de programación / almacenamiento en caché en el núcleo y los controladores del sistema de archivos que influyen cuando exactamente los datos se escriben en el disco. Esto se hace para aumentar el rendimiento. Debido a esta optimización, no se puede saber exactamente cuándo ocurrirán las escrituras. Además, los inodos antiguos en los sistemas de archivos pueden reutilizarse para que puedan aparecer archivos nuevos en las ranuras de directorio donde estaban los archivos antiguos. Por lo tanto, el orden de creación no es necesario "orden de directorio".
LawrenceC
@ultrasawblade: No estoy seguro de por qué escribiste eso como un comentario a mi propia respuesta en lugar de una respuesta por sí mismo o lo que sea.
jlliagre
@ultrasawblade: Estrictamente hablando, "los viejos inodes [siendo] reutilizados" no tiene nada que ver con la reutilización de ranuras de directorio antiguas. Esto puede suceder siempre que las entradas de directorio antiguas estén desvinculadas; si todos son enlaces duros, esto no tiene como resultado que se desasignen los inodos.
G-Man dice 'reinstalar a Monica'
2

Es el orden en que las entradas se almacenan internamente en el sistema de archivos. Esto variará de un sistema de archivos a otro. Por ejemplo, los entires pueden almacenarse en algún tipo de árbol equilibrado, como un árbol rojo-negro . Puede haber más optimizaciones para directorios con una pequeña cantidad de entradas, o para lidiar eficientemente con adiciones y eliminaciones.

KeithB
fuente
-1

El directorio es solo otro archivo, que enumera los metadatos de los archivos reales. "ls -U" simplemente enumera las entradas en el mismo orden en el archivo de directorio.

El orden está determinado por el sistema operativo y la implementación del sistema de archivos.

rajaganesh87
fuente