Einfache Möglichkeit, den Inhalt von Verzeichnissen in Linux / UNIX-Dateisystemen anzuzeigen

27

In der Vergangenheit habe ich gelernt, dass in Linux / UNIX-Dateisystemen Verzeichnisse nur Dateien sind, die die Dateinamen und Inode-Nummern der Dateien im Verzeichnis enthalten.

Gibt es eine einfache Art und Weise zu sehen , den Inhalt eines Verzeichnisses? Ich meine die Art und Weise, wie die Dateinamen und Inodes gespeichert / organisiert sind.

Ich bin nicht die Suche nach ls, findoder etwas ähnlich. Ich möchte auch nicht den Inhalt der Dateien in einem Verzeichnis sehen. Ich möchte die Implementierung der Verzeichnisse sehen. Wenn jedes Verzeichnis nur eine Textdatei mit Inhalt ist, gibt es möglicherweise eine einfache Möglichkeit, den Inhalt dieser Textdatei anzuzeigen.

In der Bash unter Linux ist es nicht möglich, eine cat folder. Die Ausgabe ist einfach Is a directory.

Update Die Frage Wie inspiziert man die Verzeichnisstrukturinformationen einer Unix / Linux-Datei? behebt das gleiche Problem, hat aber keine hilfreiche Lösung wie die von mjturner .

Nimmerland
quelle
Ich glaube nicht, dass es vi <folder>Ihren Bedürfnissen entspricht?
Ich
vim <DIR> Ist das was du willst?
7171u
Für den Anfang werfen Sie einen Blick auf den statBefehl. stat folder.
slm
2
Ich glaube das historisch cat hätte geklappt. Dieser Ansatz war jedoch vor Jahrzehnten überholt. Ich kenne keine direkte Möglichkeit, den tatsächlichen Dateisystemspeicher anzuzeigen. Stattdessen gibt es neue Systemaufrufe, um die Informationen in einem standardisierten Format zurückzugeben, das unabhängig vom verwendeten zugrunde liegenden Dateisystem gleich bleibt.
Kasperd

Antworten:

35

Das Tool zum Anzeigen von Inode-Details für ein Dateisystem ist dateisystemspezifisch. Für die ext2, ext3, ext4Dateisysteme (die am häufigsten verwendeten Linux - Dateisysteme), können Sie verwenden debugfs, für XFS xfs_db, für ZFS zdb. Für btrfseinige Informationen steht der btrfsBefehl zur Verfügung.

Um zum Beispiel ein Verzeichnis auf einen erkunden ext4Dateisystem (in diesem Fall /ist 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

Oben beginnen wir damit, den Inode von directory src( 664488) zu finden, dessen Inhalt in file abzulegen src.outund diesen dann mit anzuzeigen od. Wie Sie sehen, ist der Inhalt aller Dateien in diesem Verzeichnis ( Animation.jsusw.) im Speicherauszug sichtbar.

Dies ist nur ein Anfang - die siehe debugfsHandbuch Seite oder geben Sie helpin debugfsfür weitere Informationen.

Wenn Sie verwenden ext4, finden Sie weitere Informationen zur Struktur und zum Layout der Verzeichniseinträge in der Kerneldokumentation .

mjturner
quelle
Das ist eine großartige Antwort. Vielen Dank! Jetzt versuche ich zu untersuchen, wie ich die Inode-Nummern in dieser Ausgabe in Dezimalschreibweise anzeigen kann. Ich denke, die Werte neben den Dateinamen in der Ausgabe sind die Inode-Nummern. Oder liege ich falsch?
Neverland
@Neverland Ja, das sind die Inode-Nummern. Sie sind wahrscheinlich klarer, wenn Sie od -xdie Verzeichniseintragsdatei sichern.
mjturner
0

Sie können die Programmiersprache Ihrer Wahl verwenden, das Verzeichnis wie eine Datei öffnen und Bytes aus dem resultierenden Datei-Handle lesen. Das wird Ihnen jedoch nicht viel sagen, da es nur Müll sein wird (mit ein paar erkennbaren Zeichenfolgen), solange Sie nicht wissen, wie es organisiert ist. Wie es organisiert ist, ist so ziemlich ein Implementierungsproblem für das fragliche Dateisystem. Wenn Sie sich eingehend mit diesen Dingen befassen möchten, empfehle ich Ihnen, mit dem Lesen zu beginnen man dirent.h. Das sollte ausreichen, um Sie weiter auf das hinzuweisen, was Ihnen gefällt.

Calle Dybedahl
quelle
3
Linux lässt dies nicht zu ... und ich denke, die meisten Systeme geben die Daten in einem einheitlichen Format zurück, anstatt das, was sich tatsächlich im Dateisystem befindet.
Random832
2
Das war früher möglich. Ein Beweis dafür ist in K & R 2nd Edn zu sehen. Es ist jedoch nicht mehr möglich; Das meiste Jahrtausend war es nicht möglich.
Jonathan Leffler
Dies ist unter Unix-Systemen möglich, aber nicht erforderlich - Sie können cat nur zum Anzeigen des Inhalts verwenden, wenn Sie möchten, aber hd (Unix-Äquivalent von xxd) ist wahrscheinlich nützlicher. Ich habe festgestellt, dass Linux-basierte Systeme einen Fehler zurückgeben, wenn Sie eine Verzeichnisdatei zum Lesen öffnen, vorausgesetzt, es handelt sich um einen Fehler. "Indem du dumme Leute davon abhältst, dumme Dinge zu tun, hältst du auch kluge Leute davon auf, kluge Dinge zu tun."
FJL
0

Sie können es versuchen (Partition ist ein Beispiel).

sudo debugfs /dev/xvda1                 

Verwenden Sie dump, um Inode-Daten in eine Datei zu schreiben.

sudo dumpe2fs /dev/xvda1

Mann ist dein Freund, diese sollten dir einige Ideen geben.

mckenzm
quelle