Bagaimana saya bisa tahu jika dua file terhubung dengan keras dari baris perintah? mis. tautan sesuatu ini:
$ ls
fileA fileB fileC
$ is-hardlinked fileA fileB
yes
$ is-hardlinked fileA fileC
no
Pada kebanyakan filesystem¹, file secara unik ditentukan oleh nomor inode -nya , jadi yang perlu Anda periksa adalah apakah kedua file memiliki nomor inode yang sama dan berada di filesystem yang sama.
Ash, ksh, bash dan zsh memiliki konstruk yang melakukan pemeriksaan untuk Anda: operator kesetaraan file -ef
.
[ fileA -ef fileB ] && ! [ fileA -ef fileC ]
Untuk kasus yang lebih lanjut, ls -i /path/to/file
daftarkan nomor inode file. df -P /path/to/file
memperlihatkan sistem file tempat file itu berada (jika dua file berada di direktori yang sama, mereka berada di sistem file yang sama) Jika sistem Anda memiliki stat
perintah, mungkin ia dapat menampilkan nomor inode dan sistem file ( stat
bervariasi dari satu sistem ke sistem, periksa dokumentasi Anda). Jika Anda ingin melihat sekilas tautan keras di dalam direktori, coba ls -i | sort
(mungkin disalurkan ke awk ).
¹ Semua filesystem asli unix, dan beberapa lainnya seperti NTFS, tetapi mungkin bukan kasus eksotis seperti CramFS.
fileA -ef fileB
juga mengembalikan0
(sukses) jikafileA
symlink kefileB
, atau sebaliknya, atau keduanya terhubung ke file yang sama.[ .bashrc -ef .bash/.bashrc ]
benar. Tanpa konteks, tentu saja, saya tidak tahu mengapa itu “tidak benar-benar berfungsi” - Anda dapat membandingkan file yang salah, Anda mungkin tidak memeriksa hasilnya dengan benar, Anda dapat menggunakan shell tanpa-ef
, ...[
dan merupakan sinonim daritest
. Tetapiman [
atauman test
akan memberikan Anda halaman manual dari perintah eksternal, sedangkan hampir semua shell di luar sana memiliki perintah built-in dengan opsi yang sedikit berbeda, jadi Anda perlu mencarinya di manual shell Anda.sumber
stat -c %d
). Dan jika Anda menggunakan Linux (diberistat
perintah), shell Anda[ fileA -ef fileB ]
harus melakukan semua ini secara langsung. Juga, perintah Anda secara tidak sengaja rusak dengan nama file yang mengandung spasi putih atau\[?*
, atau dimulai dengan-
: selalu menempatkan tanda kutip ganda di sekitar susbtitutions perintah ("$(stat -c %i -- "$1")"
).function
kata kunci non-portabel dengan nama fungsi yang (karena mengandung tanda hubung) melanggar konvensi POSIX pada nama yang diizinkan?$1
dan$2
. Anda mungkin juga ingin menggunakan$()
sintaks daripada backtick karena tanda kurung memperjelas di mana perintah dimulai dan di mana berakhir dan bersarang lebih mudah.Seperti yang disarankan oleh poster pertama, Anda dapat menulis skrip berdasarkan sesuatu seperti ini di Linux:
sumber
stat -c %d
). Dan jika Anda menggunakan Linux (diberistat
perintah), shell Anda[ fileA -ef fileB ]
harus melakukan semua ini secara langsung.Dengan GNU
find(1)
versi 4.2.11 atau lebih baru Anda juga dapat menggunakan ini:Jika
fileA
file yang sama sepertifileB
itufind
akan mencetak "ya" dan kondisinya menjadi benar.Berbeda dengan menggunakan operator kesetaraan file
-ef
ini akan menelurkan proses baru.sumber