Sebagai contoh, saya punya file myold_file
. Lalu saya gunakan ln
untuk membuat tautan keras sebagai mylink
:
ln myold_file mylink
Kemudian, bahkan dengan menggunakan ls -a
, saya tidak tahu mana yang lama.
Apakah ada yang bisa diceritakan?
Sebagai contoh, saya punya file myold_file
. Lalu saya gunakan ln
untuk membuat tautan keras sebagai mylink
:
ln myold_file mylink
Kemudian, bahkan dengan menggunakan ls -a
, saya tidak tahu mana yang lama.
Apakah ada yang bisa diceritakan?
Jawaban:
Anda tidak bisa, karena mereka secara harfiah file yang sama, hanya dijangkau oleh jalur yang berbeda. Yang pertama tidak memiliki status khusus.
.bashrc
adalah file yang mengandung ..." ketika kita maksudkan, "path relatif .bashrc
mengacu pada file yang mengandung ...", ini adalah penggabungan umum dari kategori dan kita harus memahami bahwa setiap kali seseorang merujuk ke jalur atau entri direktori "menjadi" file, maksud kami file yang dirujuk. Dengan pemahaman itu, dua tautan keras dapat "menjadi" file yang sama. Menolak konvensi yang mendukung bahasa formal, mereka tidak bisa. Kedua kuda-kuda berdiri di tempatnya :-)
Tidak ada cara langsung, bersih (dapat diandalkan) untuk melakukan itu. Tetapi dalam keadaan yang tepat ini dapat dimungkinkan (atau setidaknya mungkin). Masalahnya adalah bahwa ada dua tautan keras tetapi hanya satu file. Ubah, modifikasi, dan (mungkin) waktu pembuatan disimpan untuk file (inode) saja tetapi tidak untuk entri direktori (tautan keras). Dengan demikian informasi yang Anda inginkan dapat diambil dari efek sekunder saja yang dapat dengan mudah dihancurkan oleh operasi yang tidak terkait dengan file. Dan Anda bahkan tidak bisa melihat apakah sudah dihancurkan. Anda hanya bisa tahu itu dari keadaan operasional jika Anda benar-benar menyadarinya.
Pembuatan tautan keras adalah operasi tulis ke direktori yang berisi tautan tersebut. Dengan demikian memperbarui direktori mtime
. Jadi jika
tautannya ada di direktori yang berbeda
dan Anda tahu bahwa tidak satu pun dari direktori ini telah diubah (file ditambahkan, dihapus, diganti nama atau perubahan metadata file) setelah hard link kedua dibuat maka Anda dapat membandingkan mtime
s dari direktori.
Kasus khusus: Jika salah satu direktori memiliki mtime
sebelum file (inode's) mtime
dan Anda dapat yakin bahwa file tersebut belum ditulis lebih dari beberapa saat setelah pembuatannya maka tautan direktori ini adalah yang lebih lama.
Jika tautan berada di direktori yang sama (yang tampaknya menjadi pertanyaan Anda) maka akan semakin buruk. Maka Anda bisa menggunakannya
ls -lU
untuk mendapatkan kesan urutan entri telah dibuat. Itu tidak perlu urutan yang benar karena entri dapat dihapus sehingga entri baru dibuat di tengah daftar direktori. Dan seperti yang ditunjukkan Gilles itu tidak bekerja sama sekali dengan sistem file yang lebih baru.
ls -lU
triknya tidak akan bekerja pada sistem file modern (ext4, btrfs, zfs), di sana entri tidak muncul dalam urutan pembuatan sama sekali.
rm myold_file
maka mylink
akan tetap ada dan bekerja dengan sempurna, karena itu adalah entri yang sama baiknya mengacu pada inode yang mendasari yang sama. Hanya ketika keduanya telah dihapus sistem dapat membuang inode. Setelah tautan keras telah digunakan untuk membuat dua entri sistem file yang merujuk ke file yang sama, mereka setara. (Perhatikan bahwa "file" di sini berarti "sebuah inode yang menyimpan data untuk file, sebagai lawan dari direktori). Lihat: en.wikipedia.org/wiki/Inode
Jika Anda mengandalkan waktu modifikasi terakhir dari direktori dan Anda tidak memiliki pengetahuan tentang bagaimana dan kapan direktori-direktori itu diubah, mengandalkan mtime akan membuat Anda salah dalam persentase waktu tertentu. Masalahnya di sini adalah bahwa file diwakili dalam sistem file oleh inode, bukan oleh entri direktori. Entri direktori (nama file) menunjuk ke inode, bukan file.
Saya pikir saya akan melakukan beberapa pusar memandangi mengapa saya perlu tahu entri direktori mana yang lebih tua dan bagaimana cara menghindari perlu tahu itu.
Saya pikir pertanyaan ini (cukup masuk akal) salah tentang apa sebenarnya tautan keras itu. Namun saya pikir jawaban langsung yang paling tepat adalah 'Keduanya' .
Sistem file Unix biasanya menyimpan isi file aktual dan data dalam node-i, ini tidak memiliki jalur apa pun, jalur kemudian memiliki banyak hubungan ke simpul-i ini. Ambil analogi seseorang yang menggunakan dua nama, Bob dan Joe. Orang tidak dapat mengatakan bahwa Bob lebih tua dari Joe atau sebaliknya, mereka hanya nama untuk orang yang sama.
Jika Anda ingin mempertahankan konsep file 'asli' dan yang baru Anda cenderung mencari tautan simbolis, ini lebih merupakan alias, hanya instruksi ke OS yang seharusnya beroperasi ke satu jalur seolah-olah mereka ke yang lain tanpa mengubah struktur file di bawahnya. (Anda dapat membuatnya dengan "ln -s file link".
Inti dari jawaban yang diberikan oleh beberapa orang lain di atas adalah bahwa setiap nama file adalah tautan keras ke sebuah file. Tidak ada yang asli asli, hanya mungkin yang pertama.
Pikirkan direktori sebagai tabel yang mencantumkan nama file dan nomor inode.
Setiap tautan keras, termasuk yang pertama, adalah entri dalam direktori yang memberikan "nama file" ke nomor inode, sehingga Anda dapat mengakses file dengan nama itu.
File adalah kumpulan blok pada disk, dikelola dan dilacak oleh meta data yang disimpan dalam inode. File memiliki satu nomor inode.
Mengakses data file melalui nama file adalah proses tiga langkah: Nama file dicari dalam direktori untuk mendapatkan nomor inode. Inode ini kemudian dirujuk untuk menemukan blok disk yang relevan (atau blok) yang berisi data. Kemudian akhirnya blok-blok itu dibaca / ditulis.
Jadi yang dapat dibawa pulang dari semua yang pada dasarnya adalah ini: Sama sekali tidak ada perbedaan antara mengakses konten file menggunakan yang pertama ("asli") atau tautan keras yang selanjutnya dibuat.
ls > a; ln a b; rm a; ln b c
, mana yang "lebih asli" dari yang lain?a
hilang, Anda pergi denganb
danc
...