Manera simple de ver el contenido de directorios en sistemas de archivos Linux / UNIX

27

En el pasado, aprendí que en los sistemas de archivos Linux / UNIX, los directorios son solo archivos, que contienen los nombres de archivo y los números de inodo de los archivos dentro del directorio.

¿Hay una manera simple de ver el contenido de un directorio? Me refiero a la forma en que se almacenan / organizan los nombres e inodos de los archivos.

Estoy no busca ls, findo algo similar. Tampoco quiero ver el contenido de los archivos dentro de un directorio. Quiero ver la implementación de los directorios. Si cada directorio es solo un archivo de texto con algún contenido, tal vez exista una forma simple de ver el contenido de este archivo de texto.

En bash en Linux no es posible hacer un cat folder. La salida es justa Is a directory.

Actualización La pregunta ¿Cómo se inspecciona la información de estructura de directorios de un archivo unix / linux? aborda el mismo problema pero no tiene una solución útil como la de mjturner .

Neverland
fuente
¿No creo que se vi <folder>adapte a tus necesidades? Solo mencionándolo
Lenniey
vim <DIR> ¿Es esto lo que quieres?
7171u
Para empezar, mira el statcomando. stat folder.
slm
2
Creo que históricamente cathabría funcionado. Pero ese enfoque era obsoleto hace décadas. No conozco ninguna forma directa de ver el almacenamiento real del sistema de archivos. En cambio, hay nuevas llamadas al sistema para devolver la información en un formato estandarizado que permanece igual independientemente del sistema de archivos subyacente que se esté utilizando.
kasperd

Respuestas:

35

La herramienta para mostrar detalles de inodo para un sistema de archivos será específica del sistema de archivos. Para el ext2, ext3, ext4sistemas de ficheros (la mayoría de los sistemas de ficheros comunes), se puede utilizar debugfs, por XFS xfs_db, para ZFS zdb. Para btrfscierta información está disponible utilizando el btrfscomando.

Por ejemplo, para explorar un directorio en un ext4sistema de archivos (en este caso /es dev/sda1):

# ls src
Animation.js    Map.js        MarkerCluster.js    ScriptsUtil.js
Directions.js   MapTypeId.js  markerclusterer.js  TravelMode.js
library.js      MapUtils.js   Polygon.js          UnitSystem.js
loadScripts.js  Marker.js     Polyline.js         Waypoint.js

# ls -lid src
664488 drwxrwxrwx 2 vagrant vagrant 4096 Jul 15 13:24 src

# debugfs /dev/sda1
debugfs: imap <664488>
Inode 664488 is part of block group 81
        located at block 2622042, offset 0x0700
debugfs: dump src src.out
debugfs: quit

# od -c src.out
0000000 250   #  \n  \0  \f  \0 001 002   .  \0  \0  \0 204 030  \n  \0
0000020  \f  \0 002 002   .   .  \0  \0 251   #  \n  \0 024  \0  \f 001
0000040   A   n   i   m   a   t   i   o   n   .   j   s 252   #  \n  \0
0000060 030  \0  \r 001   D   i   r   e   c   t   i   o   n   s   .   j
0000100   s  \0  \0  \0 253   #  \n  \0 024  \0  \n 001   l   i   b   r
0000120   a   r   y   .   j   s  \0  \0 254   #  \n  \0 030  \0 016 001
0000140   l   o   a   d   S   c   r   i   p   t   s   .   j   s  \0  \0
0000160 255   #  \n  \0 020  \0 006 001   M   a   p   .   j   s  \0  \0
0000200 256   #  \n  \0 024  \0  \f 001   M   a   p   T   y   p   e   I
0000220   d   .   j   s 257   #  \n  \0 024  \0  \v 001   M   a   p   U
0000240   t   i   l   s   .   j   s  \0 260   #  \n  \0 024  \0  \t 001
0000260   M   a   r   k   e   r   .   j   s  \0  \0  \0 261   #  \n  \0
0000300 030  \0 020 001   M   a   r   k   e   r   C   l   u   s   t   e
0000320   r   .   j   s 262   #  \n  \0 034  \0 022 001   m   a   r   k
0000340   e   r   c   l   u   s   t   e   r   e   r   .   j   s  \0  \0
0000360 263   #  \n  \0 024  \0  \n 001   P   o   l   y   g   o   n   .
0000400   j   s  \0  \0 264   #  \n  \0 024  \0  \v 001   P   o   l   y
0000420   l   i   n   e   .   j   s  \0 265   #  \n  \0 030  \0 016 001
0000440   S   c   r   i   p   t   s   U   t   i   l   .   j   s  \0  \0
0000460 266   #  \n  \0 030  \0  \r 001   T   r   a   v   e   l   M   o
0000500   d   e   .   j   s  \0  \0  \0 267   #  \n  \0 030  \0  \r 001
0000520   U   n   i   t   S   y   s   t   e   m   .   j   s  \0  \0  \0
0000540 270   #  \n  \0 240 016  \v 001   W   a   y   p   o   i   n   t
0000560   .   j   s  \0 305 031  \n  \0 214 016 022 001   .   U   n   i
0000600   t   S   y   s   t   e   m   .   j   s   .   s   w   p  \0  \0
0000620 312 031  \n  \0   p 016 022 001   .   U   n   i   t   S   y   s
0000640   t   e   m   .   j   s   .   s   w   x  \0  \0  \0  \0  \0  \0
0000660  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0

En lo anterior, comenzamos por encontrar el inodo del directorio src( 664488) y luego volcamos su contenido en el archivo src.outy luego lo mostramos usando od. Como puede ver, el contenido de todos los archivos en ese directorio ( Animation.js, etc.) son visibles en el volcado.

Esto es solo un comienzo: consulte la debugfspágina del manual o escriba helpdentro debugfspara obtener más información.

Si está utilizando ext4, puede encontrar más información sobre la estructura y el diseño de las entradas de directorio en la documentación del kernel .

mjturner
fuente
Esta es una gran respuesta. ¡Muchas gracias! Ahora trato de investigar cómo puedo mostrar los números de inodo en esta salida en notación decimal. Creo que los valores además de los nombres de archivo en la salida son los números de inodo. ¿O estoy equivocado?
Neverland
@Neverland Sí, esos son los números de inodo. Probablemente sean más claros si utiliza od -xpara volcar el archivo de entrada del directorio.
mjturner
0

Puede usar el lenguaje de programación que prefiera, abrir el directorio como si fuera un archivo y leer bytes del identificador de archivo resultante. Sin embargo, eso no le dirá mucho, ya que solo será basura (con algunas cadenas reconocibles) siempre y cuando no sepa cómo está organizado. Cómo está organizado es prácticamente un problema de implementación para el sistema de archivos en cuestión. Si desea profundizar en estas cosas, le sugiero que comience leyendo man dirent.h. Eso debería ser suficiente para señalarle más hacia lo que le apetece.

Calle Dybedahl
fuente
3
Linux no permite esto ... y creo que la mayoría de los sistemas que devuelven los datos en un formato unificado en lugar de lo que realmente está en el sistema de archivos.
Random832
2
Esto solía ser posible en los (muy) viejos tiempos. Puedes ver evidencia de esto en K&R 2nd Edn. Sin embargo, ya no es posible; No ha sido posible durante la mayor parte de este milenio.
Jonathan Leffler
Esto es posible, pero innecesario, en los sistemas Unix: puede usar cat para mostrar el contenido si lo desea, pero hd (equivalente Unix de xxd) es probablemente más útil. He notado que los sistemas basados ​​en Linux devuelven un error si abre un archivo de directorio para leer, suponiendo que sea un error. "Al detener a las personas estúpidas que hacen cosas estúpidas, también se detiene a las personas inteligentes que hacen cosas inteligentes".
FJL
0

Puedes probar (la partición es un ejemplo).

sudo debugfs /dev/xvda1                 

use dump para escribir datos de inodo en un archivo.

sudo dumpe2fs /dev/xvda1

el hombre es tu amigo, estos deberían darte algunas ideas.

mckenzm
fuente