Простий спосіб побачити вміст каталогів у файлових системах Linux / UNIX


27

Раніше я дізнався, що у файлових системах Linux / UNIX каталоги - це лише файли, які містять імена файлів і номери inode файлів всередині каталогу.

Чи є простий спосіб переглянути вміст каталогу? Я маю на увазі спосіб зберігання / впорядкування імен файлів та індесів.

Я не шукаю ls, findчи щось подібне. Я також не хочу бачити вміст файлів всередині каталогу. Я хочу бачити реалізацію каталогів. Якщо кожен каталог - це лише текстовий файл з певним вмістом, можливо, існує простий спосіб перегляду вмісту цього текстового файлу.

У баші в Linux це зробити неможливо cat folder. Вихід справедливий Is a directory.

Оновити питання Як інспектувати інформацію про структуру каталогу файлу unix / linux? вирішує ту саму проблему, але вона не має корисного рішення, як це від mjturner .


Я не думаю, що vi <folder>відповідає вашим потребам? Просто згадуючи про це
Ленні

vim <DIR> Це те, чого ти хочеш?
7171u

Для початку погляньте на statкоманду. stat folder.
slm


2
Я вважаю, що історично catце спрацювало б. Але такий підхід застарів десятиліття тому. Я не знаю жодного прямого способу побачити фактичне зберігання файлової системи. Натомість з'являються нові системні виклики для повернення інформації у стандартизованому форматі, який залишається тим самим незалежно від того, яка базова файлова система використовується.
kasperd

Відповіді:


35

Інструмент для відображення деталей inode для файлової системи буде специфічним для файлової системи. Для ext2, ext3, ext4файлові системи (найбільш поширені файлові системи Linux), ви можете використовувати debugfs, для XFS xfs_db, для ZFS zdb. Для btrfsдеякою інформацією можна з допомогою btrfsкоманди.

Наприклад, для вивчення каталогу у ext4файловій системі (у даному випадку /це 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

У вищесказаному ми починаємо з пошуку inode каталогу src( 664488), а потім скидаємо його вміст у файл, src.outа потім відображаємо це за допомогою od. Як бачите, вміст усіх файлів у цьому каталозі ( Animation.jsтощо) видно на дамп.

Це лише початок - див debugfs. Сторінку керівництва або введіть helpвсередині debugfsдля отримання додаткової інформації.

Якщо ви використовуєте ext4, ви можете знайти більше інформації про структуру та макет записів каталогів у документації на ядро .


Це чудова відповідь. Дуже дякую! Зараз я намагаюсь дослідити, як я можу відображати номери inode на цьому виході у десятковій нотації. Я думаю, що значення, крім імен файлів у висновку, є числами inode. Або я помиляюся?
Neverland

@Neverland Так, це числа inode. Вони, ймовірно, зрозуміліші, якщо ви використовуєте od -xдля скидання файлу введення каталогу.
mjturner

0

Ви можете використовувати обрану мову програмування, відкрити каталог, як ніби це файл, і прочитати байти з отриманої ручки файлу. Але це не скаже вам багато, оскільки це буде просто сміття (з кількома впізнаваними рядками в ньому), поки ви не знаєте, як це організовано. Як це організовано - це, головним чином, питання щодо впровадження відповідної файлової системи. Якщо ви хочете поглянути на ці речі глибоко, пропоную вам почати з читання man dirent.h. Цього має бути достатньо, щоб подати далі увагу на те, що вражає вашу фантазію.


3
Linux не дозволяє цього ... і я думаю, що більшість систем, які повертають дані в єдиному форматі, а не те, що є насправді у файловій системі.
Випадково832

2
Це було можливо ще в (дуже) старі часи. Докази цього ви можете побачити в K&R 2nd Edn. Однак це вже неможливо; це було неможливо протягом більшої частини цього тисячоліття.
Джонатан Леффлер

Це можливо, але непотрібно, в системах Unix - ви можете просто використовувати cat для відображення вмісту, якщо вам подобається, але hd (еквівалент Unix xxd), ймовірно, корисніший. Я помітив, що системи на базі Linux повертають помилку, якщо ви відкриєте файл каталогів для читання, припускаючи, що це помилка. "Зупиняючи дурних людей робити дурні речі, ви також перестаєте розумних людей робити розумні речі".
FJL

0

Ви можете спробувати (розділ - приклад).

sudo debugfs /dev/xvda1                 

використовувати дамп для запису даних inode у файл.

sudo dumpe2fs /dev/xvda1

людина - твій друг, вони повинні дати тобі кілька ідей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.