Prosty sposób na sprawdzenie zawartości katalogów w systemach plików Linux / UNIX

27

W przeszłości dowiedziałem się, że w systemach plików Linux / UNIX katalogi to tylko pliki, które zawierają nazwy plików i numery i-węzłów plików w katalogu.

Czy istnieje prosty sposób, aby zobaczyć zawartość katalogu? Mam na myśli sposób, w jaki nazwy plików i i-węzły są przechowywane / organizowane.

Ja nie szukam ls, findlub coś podobnego. Nie chcę też widzieć zawartości plików w katalogu. Chcę zobaczyć wdrożenie katalogów. Jeśli każdy katalog to tylko plik tekstowy z pewną zawartością, być może istnieje prosty sposób na wyświetlenie zawartości tego pliku tekstowego.

W bash w Linuksie nie można zrobić cat folder. Wynik jest po prostu Is a directory.

Aktualizacja Pytanie W jaki sposób można sprawdzić informacje o strukturze katalogów pliku unix / linux? rozwiązuje ten sam problem, ale nie ma pomocnego rozwiązania, takiego jak mjturner .

Nibylandia
źródło
Nie sądzę, że vi <folder>odpowiada Ci twoje potrzeby? Właśnie o tym wspominam
Lenniey
vim <DIR> Czy to jest to, czego chcesz?
7171u,
Na początek spójrz na statpolecenie. stat folder.
slm
możliwy duplikat Jak sprawdzić informacje o strukturze katalogów pliku Unix / Linux?
G-Man mówi „Reinstate Monica”
2
Wierzę, że historycznie catby to działało. Ale to podejście było przestarzałe dekady temu. Nie znam żadnego bezpośredniego sposobu, aby zobaczyć rzeczywistą pamięć systemu plików. Zamiast tego pojawiają się nowe wywołania systemowe w celu zwrócenia informacji w znormalizowanym formacie, który pozostaje taki sam, niezależnie od tego, który bazowy system plików jest używany.
kasperd

Odpowiedzi:

35

Narzędzie do wyświetlania szczegółów i-węzła dla systemu plików będzie specyficzne dla systemu plików. Albowiem ext2, ext3, ext4systemy plików (najczęstszą linuksowych systemów plików), można użyć debugfsdla XFS xfs_db, dla ZFS zdb. Dla btrfsniektórych informacji jest dostępna za pomocą btrfspolecenia.

Na przykład, aby eksplorować katalog w ext4systemie plików (w tym przypadku /jest 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

Powyżej zaczynamy od znalezienia i-węzła katalogu src( 664488), a następnie zrzucamy jego zawartość do pliku, src.outa następnie wyświetlamy to za pomocą od. Jak widać, zawartość wszystkich plików w tym katalogu ( Animation.jsitp.) Jest widoczna na zrzucie.

To dopiero początek - więcej informacji znajdziesz na debugfsstronie podręcznika lub wpisz helpw nim debugfs.

Jeśli używasz ext4, możesz znaleźć więcej informacji o strukturze i układzie pozycji katalogu w dokumentacji jądra .

mjturner
źródło
To świetna odpowiedź. Wielkie dzięki! Teraz próbuję zbadać, w jaki sposób mogę wyświetlić liczby i-węzłów na tym wyjściu w notacji dziesiętnej. Myślę, że wartościami oprócz nazw plików na wyjściu są liczby i-węzłów. A może się mylę?
Neverland
@Neverland Tak, to są numery i-węzłów. Prawdopodobnie są one wyraźniejsze, jeśli od -xzrzucisz plik pozycji katalogu.
mjturner
0

Możesz użyć wybranego języka programowania, otworzyć katalog tak, jakby to był plik i odczytać bajty z wynikowego uchwytu pliku. Ale to niewiele ci powie, ponieważ będą to tylko śmieci (z kilkoma rozpoznawalnymi ciągami znaków), o ile nie wiesz, jak to jest zorganizowane. Sposób organizacji jest w zasadzie problemem związanym z implementacją danego systemu plików. Jeśli chcesz przyjrzeć się tym zagadnieniom, proponuję zacząć od przeczytania man dirent.h. To powinno wystarczyć, aby skierować Cię dalej w stronę tego, co Cię interesuje.

Calle Dybedahl
źródło
3
Linux nie pozwala na to ... i myślę, że większość systemów, które zwracają dane w ujednoliconym formacie, a nie jakikolwiek system plików.
Random832
2
Było to możliwe już w (bardzo) dawnych czasach. Dowody na to można zobaczyć w K&R 2nd Edn. Jednak nie jest to już możliwe; nie było to możliwe przez większość tego tysiąclecia.
Jonathan Leffler
Jest to możliwe, ale niepotrzebne, w systemach uniksowych - możesz po prostu użyć cat, aby wyświetlić zawartość, jeśli chcesz, ale hd (uniksowy odpowiednik xxd) jest prawdopodobnie bardziej przydatny. Zauważyłem, że systemy Linux zwracają błąd, jeśli otworzysz plik katalogu do odczytu, zakładając, że to błąd. „Powstrzymując głupich ludzi od robienia głupich rzeczy, powstrzymujesz także mądrych ludzi od robienia rzeczy mądrych”
płyta
0

Możesz spróbować (partycja jest przykładem).

sudo debugfs /dev/xvda1                 

użyj zrzutu, aby zapisać dane i-węzła w pliku.

sudo dumpe2fs /dev/xvda1

człowiek jest twoim przyjacielem, powinny dać ci kilka pomysłów.

mckenzm
źródło