Простой способ увидеть содержимое каталогов в файловых системах Linux / UNIX

27

В прошлом я узнал, что в файловых системах Linux / UNIX каталоги - это просто файлы, которые содержат имена файлов и номера инодов файлов внутри каталога.

Есть ли простой способ увидеть содержимое каталога? Я имею в виду способ, которым имена файлов и inode хранятся / организованы.

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

В bash в Linux это невозможно сделать cat folder. Выход просто Is a directory.

Обновление Вопрос Как проверить информацию о структуре каталогов файла Unix / Linux? решает ту же проблему, но не имеет такого полезного решения, как решение mjturner .

Neverland
источник
Я не думаю, что vi <folder>соответствует вашим потребностям? Просто
упомяну
vim <DIR> Это то, что вы хотите?
7171
Для начала взгляните на statкоманду. stat folder,
Slm
Возможная копия Как можно проверить информацию о структуре каталогов файла Unix / Linux?
G-Man говорит: «Восстанови Монику»
2
Я считаю, что исторически catэто сработало бы. Но такой подход устарел десятилетия назад. Я не знаю ни одного прямого способа увидеть фактическое хранилище файловой системы. Вместо этого есть новые системные вызовы для возврата информации в стандартизированном формате, который остается неизменным независимо от того, какая базовая файловая система используется.
Касперд

Ответы:

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 объекта directory src( 664488), а затем выгружаем его содержимое в файл src.outи затем отображаем его, используя od. Как вы можете видеть, содержимое всех файлов в этом каталоге ( Animation.jsи т. Д.) Отображается в дампе.

Это только начало - см debugfsстраницы вручную или типа helpвнутри debugfsдля получения дополнительной информации.

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

mjturner
источник
Это отличный ответ. Большое спасибо! Теперь я попытаюсь исследовать, как я могу показать номера инодов в этом выводе в десятичной записи. Я думаю, что значения помимо имен файлов в выходных данных являются номерами инодов. Или я не прав?
Неверленд
@Neverland Да, это номера инодов. Они, вероятно, более понятны, если вы используете, od -xчтобы создать дамп файла записи каталога.
mjturner
0

Вы можете использовать свой язык программирования по своему выбору, открыть каталог, как если бы это был файл, и прочитать байты из полученного дескриптора файла. Это не очень много скажет вам, так как это будет просто мусор (с несколькими узнаваемыми строками), если вы не знаете, как он организован. Как это организовано - в значительной степени проблема реализации для рассматриваемой файловой системы. Если вы хотите углубиться в эти вещи, я предлагаю вам начать с чтения man dirent.h. Этого должно быть достаточно, чтобы направить вас дальше к тому, что поражает ваше воображение.

Калле Дибедаль
источник
3
Linux не позволяет этого ... и я думаю, что большинство систем возвращают данные в унифицированном формате, а не в файловой системе.
Random832
2
Раньше это было возможно еще в (очень) старые времена. Вы можете увидеть доказательства этого в K & R 2nd Edn. Однако это больше невозможно; это было невозможно в течение большей части этого тысячелетия.
Джонатан Леффлер
Это возможно, но не нужно, в системах Unix - вы можете просто использовать cat для отображения содержимого, если хотите, но hd (Unix-эквивалент xxd), вероятно, более полезен. Я заметил, что системы на основе Linux возвращают ошибку, если вы открываете файл каталога для чтения, при условии, что это ошибка. «Переставая глупых людей делать глупости, вы также прекращаете умных людей делать умные вещи».
FJL
0

Вы можете попробовать (раздел является примером).

sudo debugfs /dev/xvda1                 

используйте dump для записи данных inode в файл.

sudo dumpe2fs /dev/xvda1

человек твой друг, это должно дать тебе несколько идей.

mckenzm
источник