Un moyen simple de voir le contenu des répertoires dans les systèmes de fichiers Linux / UNIX

27

Dans le passé, j'ai appris que dans les systèmes de fichiers Linux / UNIX, les répertoires ne sont que des fichiers, qui contiennent les noms de fichiers et les numéros d'inode des fichiers à l'intérieur du répertoire.

Existe-t-il un moyen simple de voir le contenu d'un répertoire? Je veux dire la façon dont les noms de fichiers et les inodes sont stockés / organisés.

Je ne cherche pasls , findou quelque chose de similaire. Je ne veux pas non plus voir le contenu des fichiers dans un répertoire. Je veux voir l'implémentation des répertoires. Si chaque répertoire n'est qu'un fichier texte avec du contenu, il existe peut-être un moyen simple de voir le contenu de ce fichier texte.

Dans le bash sous Linux, il n'est pas possible de faire un cat folder. La sortie est juste Is a directory.

Mettre à jour la question Comment inspecter les informations de structure de répertoire d'un fichier unix / linux? résout le même problème, mais il n'a pas de solution utile comme celle de mjturner .

Pays imaginaire
la source
Je ne pense pas qu'il vi <folder>convienne à vos besoins? Je viens de le mentionner
Lenniey
vim <DIR> c'est ce que tu veux?
7171u
Pour commencer, jetez un œil à la statcommande. stat folder.
slm
2
Je crois que, historiquement, catcela aurait fonctionné. Mais cette approche était obsolète il y a des décennies. Je ne connais aucun moyen direct de voir le stockage réel du système de fichiers. Au lieu de cela, il y a de nouveaux appels système pour renvoyer les informations dans un format normalisé qui reste le même quel que soit le système de fichiers sous-jacent utilisé.
kasperd

Réponses:

35

L'outil pour afficher les détails de l'inode pour un système de fichiers sera spécifique au système de fichiers. Pour le ext2, ext3, les ext4systèmes de fichiers (le plus de systèmes de fichiers Linux communs), vous pouvez utiliser debugfs, pour XFS xfs_db, pour ZFS zdb. Pour btrfscertaines informations est disponible en utilisant la btrfscommande.

Par exemple, pour explorer un répertoire sur un ext4système de fichiers (dans ce cas, /c'est 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

Dans ce qui précède, nous commençons par trouver l'inode de directory src( 664488), puis vidons son contenu dans un fichier src.out, puis affichons cela en utilisant od. Comme vous pouvez le voir, le contenu de tous les fichiers de ce répertoire ( Animation.js, etc.) est visible dans le vidage.

Ce n'est qu'un début - voir la debugfspage de manuel ou taper helpdedans debugfspour plus d'informations.

Si vous utilisez ext4, vous pouvez trouver plus d'informations sur la structure et la disposition des entrées de répertoire dans la documentation du noyau .

mjturner
la source
C'est une excellente réponse. Merci beaucoup! Maintenant, j'essaie de voir comment je peux afficher les numéros d'inode dans cette sortie en notation décimale. Je pense que les valeurs en plus des noms de fichiers dans la sortie sont les numéros d'inode. Ou ai-je tort?
Neverland
@Neverland Oui, ce sont les numéros d'inode. Ils sont probablement plus clairs si vous utilisez od -xpour vider le fichier d'entrée de répertoire.
mjturner
0

Vous pouvez utiliser le langage de programmation de votre choix, ouvrir le répertoire comme s'il s'agissait d'un fichier et lire les octets du descripteur de fichier résultant. Cela ne vous dira pas grand-chose, cependant, car ce ne sera que des ordures (avec quelques chaînes reconnaissables) tant que vous ne savez pas comment il est organisé. Son organisation est à peu près un problème d'implémentation pour le système de fichiers en question. Si vous voulez approfondir ces choses, je vous suggère de commencer par lire man dirent.h. Cela devrait suffire à vous orienter davantage vers ce qui vous plaît le plus.

Calle Dybedahl
la source
3
Linux ne le permet pas ... et je pense que la plupart des systèmes qui renvoient les données dans un format unifié plutôt que ce qui se trouve réellement dans le système de fichiers.
Random832
2
Cela était possible à l'époque (très) ancienne. Vous pouvez en voir la preuve dans K&R 2nd Edn. Cependant, ce n'est plus possible; cela n'a pas été possible pendant la majeure partie de ce millénaire.
Jonathan Leffler
C'est possible, mais inutile, sous les systèmes Unix - vous pouvez simplement utiliser cat pour afficher le contenu si vous le souhaitez mais hd (équivalent Unix de xxd) est probablement plus utile. J'ai remarqué que les systèmes basés sur Linux renvoient une erreur si vous ouvrez un fichier de répertoire pour lecture, en supposant que c'est une erreur. "En empêchant les gens stupides de faire des choses stupides, vous empêchez également les gens intelligents de faire des choses intelligentes".
FJL
0

Vous pouvez essayer (la partition est un exemple).

sudo debugfs /dev/xvda1                 

utilisez le vidage pour écrire des données d'inode dans un fichier.

sudo dumpe2fs /dev/xvda1

l'homme est votre ami, ceux-ci devraient vous donner quelques idées.

mckenzm
la source