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
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
Jawaban:
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/filedaftarkan nomor inode file. df -P /path/to/filememperlihatkan 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 statperintah, mungkin ia dapat menampilkan nomor inode dan sistem file ( statbervariasi 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 fileBjuga mengembalikan 0(sukses) jika fileAsymlink ke fileB, 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 dari test. Tetapi man [atau man testakan 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.
function is-hardlinked() {
r=yes
[ "`stat -c '%i' $1`" != "`stat -c '%i' $2`" ] && r=no
echo $r
}
stat -c %d). Dan jika Anda menggunakan Linux (diberi statperintah), 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")").
functionkata kunci non-portabel dengan nama fungsi yang (karena mengandung tanda hubung) melanggar konvensi POSIX pada nama yang diizinkan?
$1dan $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:
stat -c '%i' fileA fileB fileC
stat -c %d). Dan jika Anda menggunakan Linux (diberi statperintah), 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:
if [ "yes" = "$(find fileA -samefile fileB -exec echo yes \;)" ]; then
echo yes
else
echo no
fi
Jika fileAfile yang sama seperti fileBitu findakan mencetak "ya" dan kondisinya menjadi benar.
Berbeda dengan menggunakan operator kesetaraan file -efini akan menelurkan proses baru.