Cara sederhana untuk melihat isi direktori di sistem file Linux / UNIX

27

Di masa lalu, saya mengetahui bahwa di sistem file Linux / UNIX, direktori hanyalah file, yang berisi nama file dan nomor inode dari file di dalam direktori.

Apakah ada cara sederhana untuk melihat konten direktori? Maksud saya cara nama file dan inode disimpan / diatur.

Saya tidak mencari ls, findatau sesuatu yang serupa. Saya juga tidak ingin melihat konten file di dalam direktori. Saya ingin melihat implementasi direktori. Jika setiap direktori hanyalah file teks dengan beberapa konten, mungkin ada cara sederhana untuk melihat konten file teks ini.

Dalam bash di Linux tidak mungkin untuk melakukan a cat folder. Outputnya adil Is a directory.

Perbarui Pertanyaan Bagaimana seseorang memeriksa informasi struktur direktori dari file unix / linux? mengatasi masalah yang sama tetapi tidak memiliki solusi yang bermanfaat seperti yang dari mjturner .

Neverland
sumber
Saya pikir tidak vi <folder>sesuai dengan kebutuhan Anda? Sebut saja
Lenniey
vim <DIR> Apa ini yang kau inginkan?
7171u
Sebagai permulaan lihat statperintah. stat folder.
slm
kemungkinan duplikat dari Bagaimana seseorang memeriksa informasi struktur direktori dari file Unix / Linux?
G-Man Mengatakan 'Reinstate Monica'
2
Saya percaya bahwa secara historis catakan berhasil. Tetapi pendekatan itu sudah usang beberapa dekade yang lalu. Saya tidak tahu cara langsung untuk melihat penyimpanan sistem file yang sebenarnya. Sebaliknya ada panggilan sistem baru untuk mengembalikan informasi dalam format standar yang tetap sama terlepas dari sistem file mana yang digunakan.
kasperd

Jawaban:

35

Alat untuk menampilkan detail inode untuk sistem file akan spesifik sistem file. Untuk ext2, ext3, ext4filesystem (yang paling umum filesystem Linux), Anda dapat menggunakan debugfs, untuk XFS xfs_db, untuk ZFS zdb. Untuk btrfsbeberapa informasi tersedia menggunakan btrfsperintah.

Sebagai contoh, untuk menjelajahi direktori pada sistem ext4file (dalam hal ini /adalah 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

Di atas, kita mulai dengan menemukan inode direktori src( 664488) dan kemudian membuang isinya ke dalam file src.outdan kemudian menampilkannya menggunakan od. Seperti yang Anda lihat, isi semua file di direktori itu ( Animation.js, dll.) Terlihat di dump.

Ini hanya permulaan - lihat debugfshalaman manual atau ketik di helpdalamnya debugfsuntuk informasi lebih lanjut.

Jika Anda menggunakan ext4, Anda dapat menemukan informasi lebih lanjut tentang struktur dan tata letak entri direktori dalam dokumentasi kernel .

mjturner
sumber
Ini jawaban yang bagus. Terima kasih banyak! Sekarang saya mencoba untuk menyelidiki bagaimana saya dapat menunjukkan nomor inode dalam output ini dalam notasi desimal. Saya pikir nilai selain nama file dalam output adalah nomor inode. Atau saya salah?
Neverland
@Neverland Ya, itu adalah nomor inode. Mereka mungkin lebih jelas jika Anda gunakan od -xuntuk membuang file entri direktori.
mjturner
0

Anda dapat menggunakan bahasa pemrograman pilihan Anda, buka direktori seolah-olah itu file dan baca byte dari file yang dihasilkan. Itu tidak akan memberi tahu Anda banyak, karena itu hanya akan menjadi sampah (dengan beberapa string yang dikenali di dalamnya) selama Anda tidak tahu bagaimana itu diatur. Bagaimana pengaturannya adalah masalah implementasi untuk sistem file yang dimaksud. Jika Anda ingin melihat hal-hal ini secara mendalam, saya sarankan Anda mulai dengan membaca man dirent.h. Itu seharusnya cukup untuk mengarahkan Anda lebih jauh ke arah apa yang Anda sukai.

Calle Dybedahl
sumber
3
Linux tidak mengizinkan ini ... dan saya pikir sebagian besar sistem yang mengembalikan data dalam format terpadu daripada apa pun yang sebenarnya ada di sistem file.
Random832
2
Ini dulunya mungkin di masa lalu (sangat). Anda dapat melihat bukti ini di K&R 2nd Edn. Namun, itu tidak mungkin lagi; hampir tidak mungkin selama milenium ini.
Jonathan Leffler
Ini dimungkinkan, tetapi tidak perlu, di bawah sistem Unix - Anda bisa menggunakan cat untuk menampilkan konten jika Anda suka, tetapi hd (Unix setara dengan xxd) mungkin lebih berguna. Saya perhatikan bahwa sistem berbasis Linux mengembalikan kesalahan jika Anda membuka file direktori untuk dibaca, dengan asumsi itu adalah kesalahan. "Dengan menghentikan orang bodoh melakukan hal bodoh, kamu juga berhenti orang pintar melakukan hal pintar".
FJL
0

Anda dapat mencoba (partisi adalah contoh).

sudo debugfs /dev/xvda1                 

gunakan dump untuk menulis data inode ke file.

sudo dumpe2fs /dev/xvda1

pria adalah teman Anda, ini harus memberi Anda beberapa ide.

mckenzm
sumber