GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Anda bisa melihat tautan keras yang sebenarnya oleh ls?

Anda dapat menemukan nomor inode untuk file Anda dengan

ls -i

dan

ls -l

menunjukkan jumlah referensi (jumlah hardlink ke inode tertentu)

setelah Anda menemukan nomor inode, Anda dapat mencari semua file dengan inode yang sama:

find . -inum NUM

akan menampilkan nama file untuk inode NUM di direktori saat ini (.)


Sebenarnya tidak ada jawaban yang jelas untuk pertanyaan Anda. Tidak seperti symlink, hardlink tidak dapat dibedakan dari "file asli".

Entri direktori terdiri dari nama file dan pointer ke inode. Inode pada gilirannya berisi metadata file dan (menunjuk ke) konten file yang sebenarnya). Membuat tautan keras membuat nama file lain + referensi ke inode yang sama. Referensi ini searah (setidaknya dalam sistem file tipikal) -- inode hanya menyimpan jumlah referensi. Tidak ada cara intrinsik untuk mengetahui nama file "asli".

Omong-omong, ini sebabnya panggilan sistem untuk "menghapus" file disebut unlink . Itu hanya menghapus hardlink. Inode dan data terlampir dihapus hanya jika jumlah referensi inode turun menjadi 0.

Satu-satunya cara untuk menemukan referensi lain ke inode yang diberikan adalah dengan mencari secara mendalam sistem file untuk memeriksa file mana yang merujuk ke inode yang dimaksud. Anda dapat menggunakan 'test A -ef B' dari shell untuk melakukan pemeriksaan ini.


UNIX memiliki tautan keras dan tautan simbolik (dibuat dengan "ln" dan "ln -s" masing-masing). Tautan simbolik hanyalah sebuah file yang berisi jalur sebenarnya ke file lain dan dapat melintasi sistem file.

Tautan keras telah ada sejak hari-hari awal UNIX (yang dapat saya ingat, dan itu sudah cukup lama). Itu adalah dua entri direktori yang mereferensikan tepatnya data dasar yang sama. Data dalam file ditentukan oleh inode . Setiap file pada sistem file mengarah ke inode tetapi tidak ada persyaratan bahwa setiap file mengarah ke inode unik - dari sanalah tautan keras berasal.

Karena inode unik hanya untuk sistem file tertentu, ada batasan bahwa tautan keras harus berada pada sistem file yang sama (tidak seperti tautan simbolik). Perhatikan bahwa, tidak seperti tautan simbolik, tidak ada file istimewa - semuanya sama. Area data hanya akan dirilis saat semua file yang menggunakan inode tersebut dihapus (dan semua proses juga menutupnya, tapi itu masalah yang berbeda).

Anda dapat menggunakan "ls -i" perintah untuk mendapatkan inode dari file tertentu. Anda kemudian dapat menggunakan "find <filesystemroot> -inum <inode>" perintah untuk menemukan semua file pada sistem file dengan inode yang diberikan.

Inilah skrip yang melakukan hal itu. Anda memanggilnya dengan:

findhardlinks ~/jquery.js

dan itu akan menemukan semua file di sistem file itu yang merupakan tautan keras untuk file itu:

[email protected]:~# ./findhardlinks /home/pax/jquery.js
Processing '/home/pax/jquery.js'
   '/home/pax/jquery.js' has inode 5211995 on mount point '/'
       /home/common/jquery-1.2.6.min.js
       /home/pax/jquery.js

Ini skripnya.

#!/bin/bash
if [[ $# -lt 1 ]] ; then
    echo "Usage: findhardlinks <fileOrDirToFindFor> ..."
    exit 1
fi

while [[ $# -ge 1 ]] ; do
    echo "Processing '$1'"
    if [[ ! -r "$1" ]] ; then
        echo "   '$1' is not accessible"
    else
        numlinks=$(ls -ld "$1" | awk '{print $2}')
        inode=$(ls -id "$1" | awk '{print $1}' | head -1l)
        device=$(df "$1" | tail -1l | awk '{print $6}')
        echo "   '$1' has inode ${inode} on mount point '${device}'"
        find ${device} -inum ${inode} 2>/dev/null | sed 's/^/        /'
    fi
    shift
done

Linux
  1. Bagaimana saya bisa mengukur penggunaan memori sebenarnya dari suatu aplikasi atau proses?

  2. tr perintah - cara mengganti string \n dengan baris baru yang sebenarnya (\n)

  3. Bagaimana saya bisa menambahkan string ke awal setiap baris dalam sebuah file?

  1. Bagaimana saya bisa menambahkan pengguna biasa ke file sudoers?

  2. Bagaimana Anda mem-gunzip file dan menyimpan file .gz?

  3. Bagaimana cara memastikan sistem saya menggunakan file ~/.screenrc?

  1. Bagaimana Anda bisa mengidentifikasi chipset perangkat usb di Linux?

  2. Bagaimana saya bisa menghapus baris baru jika itu adalah karakter terakhir dalam file?

  3. Bagaimana saya bisa menghubungkan file di Linux?