Maneira simples de ver o conteúdo dos diretórios nos sistemas de arquivos Linux / UNIX

27

No passado, aprendi que nos sistemas de arquivos Linux / UNIX, os diretórios são apenas arquivos, que contêm os nomes dos arquivos e os números de inode dos arquivos dentro do diretório.

Existe uma maneira simples de ver o conteúdo de um diretório? Quero dizer a maneira como os nomes e inodes dos arquivos são armazenados / organizados.

Estou não procurar ls, findou algo semelhante. Também não quero ver o conteúdo dos arquivos dentro de um diretório. Eu quero ver a implementação dos diretórios. Se todo diretório for apenas um arquivo de texto com algum conteúdo, talvez exista uma maneira simples de ver o conteúdo desse arquivo de texto.

No bash no Linux, não é possível fazer a cat folder. A saída é justa Is a directory.

Atualizar a pergunta Como alguém inspeciona as informações da estrutura de diretórios de um arquivo unix / linux? soluciona o mesmo problema, mas não possui solução útil como a do mjturner .

Terra do Nunca
fonte
Eu não acho que vi <folder>atende às suas necessidades? Apenas mencionando
Lenniey
vim <DIR> É isso que voce quer?
7171u 17/07/2015
Para iniciantes, dê uma olhada no statcomando. stat folder.
Slm
2
Eu acredito que historicamente catteria funcionado. Mas essa abordagem era obsoleta décadas atrás. Não conheço nenhuma maneira direta de ver o armazenamento real do sistema de arquivos. Em vez disso, há novas chamadas do sistema para retornar as informações em um formato padronizado, que permanece o mesmo, independentemente do sistema de arquivos subjacente que está sendo usado.
kasperd

Respostas:

35

A ferramenta para exibir detalhes do inode para um sistema de arquivos será específica do sistema de arquivos. Para o ext2, ext3, ext4sistemas de arquivos (a maioria dos sistemas de arquivos comuns do Linux), você pode usar debugfs, por XFS xfs_db, para ZFS zdb. Para btrfsalgumas informações, consulte o btrfscomando

Por exemplo, para explorar um diretório em um ext4sistema de arquivos (neste caso, /é 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

No exemplo acima, começamos encontrando o inode do diretório src( 664488) e, em seguida, despejamos seu conteúdo no arquivo src.oute, em seguida, exibimos isso usando od. Como você pode ver, o conteúdo de todos os arquivos desse diretório ( Animation.js, etc.) é visível no despejo.

Isso é apenas o começo - consulte a debugfspágina do manual ou digite- helpa debugfspara obter mais informações.

Se você estiver usando ext4, poderá encontrar mais informações sobre a estrutura e o layout das entradas de diretório na documentação do kernel .

mjturner
fonte
Esta é uma ótima resposta. Muito obrigado! Agora, tento investigar como posso mostrar os números de inode nesta saída em notação decimal. Eu acho que os valores além dos nomes dos arquivos na saída são os números dos inodes. Ou eu estou errado?
Neverland
@ Neverland Sim, esses são os números dos inodes. Eles provavelmente serão mais claros se você usar od -xpara despejar o arquivo de entrada do diretório.
Mjturner
0

Você pode usar sua linguagem de programação preferida, abrir o diretório como se fosse um arquivo e ler bytes do identificador de arquivo resultante. Isso não vai dizer muito, no entanto, já que será apenas lixo (com algumas seqüências reconhecíveis) desde que você não saiba como está organizado. A organização do processo é praticamente um problema de implementação do sistema de arquivos em questão. Se você quiser examinar essas coisas em profundidade, sugiro que comece lendo man dirent.h. Isso deve ser o suficiente para direcioná-lo ainda mais para o que chama sua atenção.

Calle Dybedahl
fonte
3
O Linux não permite isso ... e acho que a maioria dos sistemas retorna os dados em um formato unificado, e não o que realmente está no sistema de arquivos.
Random832
2
Isso costumava ser possível nos dias (muito) antigos. Você pode ver evidências disso no K&R 2nd Edn. No entanto, não é mais possível; isso não foi possível durante a maior parte deste milênio.
27616 Jonathan
Isso é possível, mas desnecessário, nos sistemas Unix - você pode apenas usar cat para exibir o conteúdo, se quiser, mas hd (equivalente a xxd no Unix) é provavelmente mais útil. Percebi que os sistemas baseados em Linux retornam um erro se você abrir um arquivo de diretório para leitura, supondo que seja um erro. "Ao impedir que pessoas estúpidas façam coisas estúpidas, você também impede que pessoas inteligentes façam coisas inteligentes".
FJL 06/02
0

Você pode tentar (a partição é um exemplo).

sudo debugfs /dev/xvda1                 

use dump para gravar dados de inode em um arquivo.

sudo dumpe2fs /dev/xvda1

homem é seu amigo, isso deve lhe dar algumas idéias.

mckenzm
fonte