Modo semplice per visualizzare il contenuto delle directory nei file system Linux / UNIX


27

In passato, ho imparato che nei file system Linux / UNIX le directory sono solo file che contengono i nomi dei file e i numeri di inode dei file all'interno della directory.

C'è un modo semplice per vedere il contenuto di una directory? Intendo il modo in cui i nomi dei file e gli inode sono memorizzati / organizzati.

Sto Non cercare ls, findo qualcosa di simile. Inoltre, non voglio vedere il contenuto dei file all'interno di una directory. Voglio vedere l'implementazione delle directory. Se ogni directory è solo un file di testo con alcuni contenuti, forse esiste un modo semplice per vedere il contenuto di questo file di testo.

Nella bash in Linux non è possibile fare un cat folder. L'output è giusto Is a directory.

Aggiornamento La domanda Come si controllano le informazioni sulla struttura delle directory di un file unix / linux? risolve lo stesso problema ma non ha una soluzione utile come quella di mjturner .


Non penso sia vi <folder>adatto alle tue esigenze?
Ne ho

vim <DIR> È questo che vuoi?
7171u,

Per cominciare dai un'occhiata al statcomando. stat folder.
slm


2
Credo che storicamente catavrebbe funzionato. Ma questo approccio era obsoleto decenni fa. Non conosco alcun modo diretto per vedere l'archiviazione effettiva del file system. Esistono invece nuove chiamate di sistema per restituire le informazioni in un formato standardizzato che rimane lo stesso indipendentemente dal file system sottostante utilizzato.
Kasperd,

Risposte:


35

Lo strumento per visualizzare i dettagli dell'inode per un filesystem sarà specifico del filesystem. Per il ext2, ext3, ext4file system (la maggior parte dei file system comune Linux), è possibile utilizzare debugfs, per XFS xfs_db, per ZFS zdb. Per btrfsalcune informazioni è disponibile utilizzando il btrfscomando.

Ad esempio, per esplorare una directory su un ext4filesystem (in questo 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

In quanto sopra, iniziamo trovando l'inode di directory src( 664488) e quindi scaricando il suo contenuto in file src.oute quindi visualizzandolo usando od. Come puoi vedere, i contenuti di tutti i file in quella directory ( Animation.js, ecc.) Sono visibili nel dump.

Questo è solo un inizio: vedere la debugfspagina di manuale o digitare helpall'interno debugfsper ulteriori informazioni.

Se stai usando ext4, puoi trovare maggiori informazioni sulla struttura e il layout delle voci della directory nella documentazione del kernel .


Questa è un'ottima risposta Molte grazie! Ora provo a studiare come posso mostrare i numeri di inode in questo output in notazione decimale. Penso che i valori oltre ai nomi dei file nell'output siano i numeri di inode. O mi sbaglio?
Neverland,

@Neverland Sì, quelli sono i numeri dell'inode. Probabilmente sono più chiari se si utilizza od -xper scaricare il file della voce della directory.
mjturner,

0

Puoi usare il tuo linguaggio di programmazione preferito, aprire la directory come se fosse un file e leggere i byte dall'handle del file risultante. Questo non ti dirà molto, però, dal momento che sarà solo spazzatura (con alcune stringhe riconoscibili al suo interno) fintanto che non sai come sia organizzata. Il modo in cui è organizzato è praticamente un problema di implementazione per il file system in questione. Se vuoi approfondire queste cose, ti suggerisco di iniziare leggendo man dirent.h. Questo dovrebbe essere sufficiente per indicarti ulteriormente ciò che colpisce la tua fantasia.


3
Linux non lo consente ... e penso che la maggior parte dei sistemi che restituiscono i dati in un formato unificato piuttosto che qualunque cosa sia effettivamente nel filesystem.
Casuale 832,

2
Questo era possibile ai tempi (molto) antichi. Puoi vederne le prove in K&R 2nd Edn. Tuttavia, non è più possibile; non è stato possibile per gran parte di questo millennio.
Jonathan Leffler,

Questo è possibile, ma non necessario, nei sistemi Unix: puoi semplicemente usare cat per visualizzare i contenuti se ti piace, ma hd (equivalente Unix di xxd) è probabilmente più utile. Ho notato che i sistemi basati su Linux restituiscono un errore se si apre un file di directory per la lettura, supponendo che sia un errore. "Impedendo alle persone stupide di fare cose stupide, si impedisce anche alle persone intelligenti di fare cose intelligenti".
FJL

0

Puoi provare (la partizione è un esempio).

sudo debugfs /dev/xvda1                 

usa dump per scrivere dati inode in un file.

sudo dumpe2fs /dev/xvda1

l'uomo è tuo amico, questi dovrebbero darti alcune idee.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.