Dengan cepat menemukan file mana yang milik nomor inode tertentu

44

Saya tahu perintah ini:

find /path/to/mountpoint -inum <inode number>

tapi ini pencarian yang sangat lambat, saya merasa harus ada cara yang lebih cepat untuk melakukan ini. Adakah yang tahu metode yang lebih cepat?

Alex
sumber
Ini adalah pertama kalinya saya melihat pencarian menggunakan inode. Kapan Anda perlu mencari dengan inode?
Coren
@Coren - ini biasa digunakan jika Anda memiliki file dengan, katakanlah, "-" di depan. Anda dapat melakukan ls -li untuk menemukan inode-nya, lalu: find. -inum <inode> -exec rm -i {} \; Ini adalah pendekatan sabuk-dan-pengikat untuk memastikan Anda dapat menghapus file. Tentu saja, Anda juga bisa 'rm - -filename', atau rm ./-filename, atau rm "-filename".
swisscheese
2
@ Koren dengan selinux, pesan log menyertakan inode, tetapi bukan path lengkap. Jadi, Anda harus mencari inode untuk menemukan file yang dirujuk. (toh itu use case saya)
Patrick
1
@Coren Misalnya ketika file memiliki banyak tautan keras, Anda telah melihat bahwa kontennya sudah usang dan ingin menghapus file tersebut, tetapi Anda hanya menemukan salah satu nama file dan ingin menghapus yang lain.
Gilles 'SANGAT berhenti menjadi jahat'
2
Gunakan saja find / -inum <inode>. Ini jauh lebih portabel daripada debugfsdan juga bekerja jauh lebih andal (itu dapat menemukan jalur yang bukan milik file pada hard drive, seperti perangkat, misalnya).
7heo.tk

Jawaban:

33

Untuk sistem file ext4, Anda dapat menggunakan debugfsseperti pada contoh berikut:

$ sudo debugfs -R 'ncheck 393094' /dev/sda2 2>/dev/null
Inode   Pathname
393094  /home/enzotib/examples.desktop

Jawabannya tidak langsung, tetapi tampaknya lebih baik daripada find.
Output yang diperoleh dapat dengan mudah diurai untuk mendapatkan nama file.

enzotib
sumber
Saya mungkin harus menentukan tipe sistem file. Tidak terpikir oleh saya bahwa metode melakukan hal-hal ini akan berbeda untuk sistem file yang berbeda. Saya menggunakan XFS, jadi walaupun saya yakin jawaban Anda benar, itu tidak akan membantu saya secara khusus.
Alex
6

btrfs

man btrfs-inspect-internal mengatakan:

   inode-resolve [-v] <ino> <path>
       (needs root privileges)

       resolve paths to all files with given inode number ino in a given
       subvolume at path, ie. all hardlinks

       Options

       -v
           verbose mode, print count of returned paths and ioctl()
           return value

Contoh:

  • sudo btrfs inspect-internal inode-resolve 15380 /home
Tom Hale
sumber
0

Anda dapat melihat perintah fsdb, ditemukan di sebagian besar Unices, dan tersedia di suatu tempat untuk Linux saya yakin. Ini adalah perintah yang kuat yang memungkinkan Anda untuk mengakses struktur inode in-core file, jadi berhati-hatilah. Sintaksnya juga sangat singkat.

fsdb untuk AIX

fsdb tautan ulang file di Solaris

Sementara fsdb tidak akan benar-benar membiarkan Anda menemukan nama file dari inode, itu tidak memungkinkan Anda untuk langsung mengakses inode ketika Anda tentukan itu, pada dasarnya "port" Anda ke file itu sendiri (atau setidaknya itu blok data pointer) sehingga lebih cepat dalam hal itu daripada menemukan ;-).
Pertanyaan Anda tidak menentukan apa yang ingin Anda lakukan dengan file tersebut. Apakah Anda mungkin memecahkan kode file NFS?

sc.

keju Swiss
sumber
Yah, saya tidak berpikir apa yang akan saya lakukan dengan informasi itu relevan dengan pertanyaan saya, jadi saya meninggalkannya. Dalam kasus saya, itu hanyalah pertanyaan rasa ingin tahu; defragmentasi xfs_fsr saya memuntahkan defragments inode mana, dan satu sangat terfragmentasi (lebih dari 5000 extents) dan saya hanya ingin tahu file mana itu. findbekerja, itu sangat lambat.
Alex
Saya mencoba untuk memperbaiki masalah ketika rhel vm saya melakukan fsck (20 menit!) Penuh setiap boot dan yang harus saya jalani adalah nomor inode yang dilaporkan di / var / opt / messages salah. (Karena itu, cari -inum tidak benar-benar menemukannya)