Saya membuat skrip shell yang akan mengambil nama file / path ke file dan menentukan apakah file tersebut merupakan tautan simbolik atau tautan keras.
Satu-satunya hal adalah, saya tidak tahu bagaimana cara melihat apakah itu tautan keras. Saya membuat 2 file, satu tautan keras dan satu tautan simbolik, untuk digunakan sebagai file uji. Tetapi bagaimana saya menentukan apakah suatu file merupakan tautan keras atau simbolis dalam skrip shell?
Juga, bagaimana saya menemukan partisi tujuan tautan simbolik? Jadi katakanlah saya memiliki file yang tertaut ke partisi yang berbeda, bagaimana saya menemukan jalur ke file asli itu?
shell-script
files
symlink
hard-link
k-Rocker
sumber
sumber
ln /foo/bar/ /foo/bar2
membuat hardlink sambilln -s /foo/bar /foo/bar2
membuat symlink, itu yang dia maksud?bar2
danbar
keduanya merupakan tautan keras, hanya menunjuk ke inode yang sama.bar
danbar2
sama-sama penting. Satu bukan tautan ke yang lain, keduanya merupakan tautan tetapi mengarah ke inode yang sama.ln
tidak berbeda dengan file biasa.Jawaban:
Jawaban Jim menjelaskan bagaimana untuk menguji symlink: dengan menggunakan
test
's-L
tes.Tetapi pengujian untuk "hard link" adalah, yah, sebenarnya bukan yang Anda inginkan. Hard link berfungsi karena cara Unix menangani file: setiap file diwakili oleh satu inode. Kemudian satu inode memiliki nol atau lebih nama atau entri direktori atau, secara teknis, tautan keras (apa yang Anda sebut "file").
Untungnya,
stat
perintah, jika tersedia, dapat memberi tahu Anda berapa banyak nama yang dimiliki inode.Jadi Anda mencari sesuatu seperti ini (di sini mengasumsikan implementasi GNU atau busybox
stat
):The
-c '%h'
bit mengatakanstat
untuk hanya output jumlah hardlinks ke inode, yaitu, jumlah nama file memiliki.-gt 1
kemudian periksa apakah itu lebih dari 1.Perhatikan bahwa symlink, sama seperti file lainnya, juga dapat ditautkan ke beberapa direktori sehingga Anda dapat memiliki beberapa hardlink ke satu symlink.
sumber
stat -f %l /path/to/file
. Anda juga dapat menggunakangstat -c %h /path/to/file
jika GNU coreutils diinstal tanpa nama standarnya (dengan Homebrew pada OS X).Sebuah contoh:
The
f1
,f2
danf3
direktori entri adalah file yang sama (inode yang sama: 10.802.124, Anda akan melihat jumlah link adalah 3). Itu adalah tautan keras ke file biasa yang sama .s4
dans5
juga file yang sama (10802384). Mereka adalah tipe symlink , tidak reguler . Mereka menunjuk jalan, di sinis3
. Karenas4
dans5
entri dari direktori yang sama, jalur relatif tersebuts3
menunjuk ke file yang sama (yang dengan inod 10802347) untuk keduanya.Jika Anda melakukan
ls -Ll
, itu meminta untuk mendapatkan informasi file setelah menyelesaikan symlink:Anda akan menemukan mereka semua menyelesaikan ke file yang sama (10802124).
Anda dapat memeriksa apakah suatu file bersinkronisasi dengan
[ -L file ]
. Demikian pula, Anda dapat menguji apakah suatu file adalah file biasa[ -f file ]
, tetapi dalam kasus itu, pemeriksaan dilakukan setelah menyelesaikan symlink.hardlink bukan jenis file, mereka hanya nama yang berbeda untuk file (jenis apa pun).
sumber
Menggunakan
-h
dan-L
operatortest
perintah:http://www.mkssoftware.com/docs/man1/test.1.asp
Menurut utas SO ini , mereka memiliki perilaku yang sama, tetapi
-L
lebih disukai.sumber
inode
. Juga, tautan lunak menunjukkan sebuahl
di awalls -l
outputnya ... Saya pikir Anda mungkin dapat menyatukan aturan-aturan itu dalam sebuah skrip, ditambah[[ -L file ]]
tes untuk melihat apakah file yang diberikan lunak atau keras .Ada banyak jawaban yang benar di sini, tapi saya rasa tidak ada orang yang benar-benar mengatasi kesalahan persepsi. Pertanyaan aslinya pada dasarnya adalah "ketika saya membuat tautan simbolik, mudah untuk mengidentifikasinya setelah itu. Tapi saya tidak tahu bagaimana mengidentifikasi tautan keras." Dan ya, jawabannya pada dasarnya bermuara pada "Anda tidak bisa," dan kurang lebih menjelaskan mengapa, tetapi tampaknya tidak ada yang mengakui bahwa, memang, itu membingungkan dan aneh.
Jika Anda membaca semua ini dan Anda sudah tahu apa yang terjadi, maka Anda baik; Anda tidak perlu membaca sedikit pun. Jika Anda masih bingung, teruskan.
Jawaban yang benar-benar sangat singkat adalah bahwa tautan keras sama sekali bukan tautan sama sekali, tidak seperti tautan simbolis. Ini adalah entri baru dalam struktur direktori yang menunjuk ke sekelompok byte yang sama dengan entri direktori asli, dan setelah Anda membuatnya, itu sama 'nyata' dan sah seperti yang pertama. Setiap file 'normal' pada drive Anda memiliki setidaknya satu tautan keras; tanpa itu, Anda tidak akan melihatnya di mana pundirektori, dan tidak akan dapat merujuk atau menggunakannya. Jadi jika Anda memiliki file Fred.txt, dan Anda memasang tautan keras Wilma.txt dan Barney.txt ke sana, ketiga nama (dan entri direktori) merujuk ke file yang sama, dan mereka semua sama-sama valid. Tidak ada cara bagi OS untuk mengatakan bahwa salah satu entri dibuat ketika Anda menekan "save" di editor teks Anda, dan yang lain dibuat dengan perintah "ln".
OS memang harus melacak berapa banyak entri yang berbeda menunjuk ke file yang sama. Jika Anda menghapus Wilma.txt, tidak mengherankan bahwa Anda tidak membebaskan ruang apa pun di drive Anda. Tetapi jika Anda menghapus Fred.txt (file 'asli'), Anda masih tidak akan membebaskan ruang apa pun di drive Anda, karena data pada drive yang dikenal sebagai Fred.txt masih juga Barney.txt. Hanya ketika Anda menghapus semua entri direktori akan OS de-mengalokasikan ruang bahwa data itu sendiri menempati.
Jika Barney.txt telah menjadi tautan simbolis, maka menghapus Fred.txt akan menghilangkan alokasi ruang, dan Barney.txt sekarang akan menjadi tautan yang rusak. Juga, jika Anda memindahkan atau mengganti nama file yang memiliki tautan simbolik yang mengarah padanya, Anda akan memutus tautan tersebut. Tetapi Anda dapat memindahkan atau mengganti nama file yang ditautkan dengan keras semua yang Anda inginkan tanpa merusak entri direktori lain yang mengarah ke file / data itu, karena semuanya adalah entri direktori yang merujuk pada blok data yang sama pada drive (dengan menggunakan inode # dari data itu).
[Ini dua tahun kemudian, dan yang terakhir sedikit bingung saya selama satu menit, jadi saya pikir saya akan mengklarifikasi. Jika Anda mengetik "mv ./Wilma.txt ../elsewhere/Betty.txt" sepertinya Anda memindahkan file, tetapi pada kenyataannya, Anda tidak. Apa yang sebenarnya Anda lakukan adalah menghapus item baris dari daftar direktori dari direktori Anda saat ini, yang bertuliskan "nama 'Wilma.txt' dikaitkan dengan data yang dapat ditemukan dengan menggunakan inode ###### #, "dan menambahkan item baris baru ke daftar direktori direktori ../di suatu tempat yang mengatakan" nama 'Betty.txt' dikaitkan dengan data yang dapat ditemukan melalui inode ####### ". Inilah sebabnya mengapa Anda dapat 'memindahkan' file 2 gigabyte secepat file 2 kilobyte, selama Anda memindahkannya ke lokasi lain di drive yang sama.]
Karena OS harus melacak berapa banyak entri direktori yang berbeda menunjuk ke potongan data yang sama, Anda dapat mengetahui apakah file tertentu telah ditautkan dengan susah payah, walaupun Anda tidak dapat memastikan apakah entri direktori yang Anda pilih memiliki Sedang melihat adalah yang 'asli' atau tidak. Salah satu caranya adalah perintah "ls", khususnya "ls-l" (itu huruf kecil L setelah tanda hubung)
Untuk meminjam contoh sebelumnya ....
Huruf pertama adalah tanda hubung, jadi ini bukan direktori atau sesuatu yang eksotis, itu adalah file biasa 'biasa'. Tetapi jika itu benar-benar biasa, angka itu setelah bagian rwx-ish akan menjadi "1", seperti pada, "ada satu entri direktori yang menunjuk ke blok data ini." Tapi itu bagian dari demonstrasi tautan keras, jadi alih-alih tertulis "3".
Perhatikan bahwa ini mungkin dapat mengarah pada perilaku aneh dan misterius (jika Anda belum membungkus kepala dengan tautan keras, itu). Jika Anda membuka Fred.txt di editor teks Anda dan membuat beberapa perubahan, apakah Anda akan melihat perubahan yang sama di Wilma.txt dan Barney.txt? Mungkin. Mungkin. Jika editor teks Anda menyimpan perubahan dengan membuka file asli dan menulis perubahan itu, maka ya, ketiga nama masih akan menunjuk pada teks yang sama (baru diubah). Tetapi jika editor teks Anda membuat file baru (Fred-new-temp.txt), tulis versi Anda yang diubah itu, lalu hapus Fred.txt, lalu ganti nama Fred-new-temp.txt menjadi Fred.txt, Wilma dan Barney akan masih menunjuk ke versi asli, bukan versi yang baru diubah. Jika Anda tidak mengerti tautan keras, ini bisa membuat Anda sedikit marah. :) [Oke, sebenarnya saya tidak tahu secara pribadieditor teks yang akan melakukan hal yang baru-file / rename, tapi saya tahu banyak program lain yang melakukan hal itu, jadi tetap waspada.]
Catatan terakhir: salah satu hal yang diperiksa oleh 'fsck' (sistem file) adalah jika ada blok data pada drive Anda yang entah bagaimana tidak lagi dirujuk oleh entri direktori. Terkadang ada yang tidak beres, dan satu-satunya entri direktori yang menunjuk ke inode akan dihapus tetapi ruang drive itu sendiri tidak ditandai sebagai "tersedia." Jadi salah satu tugas fsck adalah mencocokkan semua ruang yang dialokasikan dengan semua entri direktori untuk memastikan bahwa tidak ada file yang tidak direferensikan. Jika menemukan beberapa, itu menciptakan entri direktori baru dan menempatkannya di "hilang + ditemukan".
sumber
Anda dapat menggunakan
readlink FILE; echo $?
. Ini mengembalikan 1 saat hardlink dan 0 saat symlink.Dari halaman manual: "Ketika dipanggil sebagai readlink, hanya target dari tautan simbolik yang dicetak. Jika argumen yang diberikan bukan tautan simbolik, readlink tidak akan mencetak apa pun dan keluar dengan kesalahan."
sumber