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/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 mengembalikan 0
(sukses) jika fileA
symlink 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 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.
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 stat
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:
stat -c '%i' fileA fileB fileC
stat -c %d
). Dan jika Anda menggunakan Linux (diberi stat
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:
if [ "yes" = "$(find fileA -samefile fileB -exec echo yes \;)" ]; then
echo yes
else
echo no
fi
Jika fileA
file yang sama seperti fileB
itu find
akan mencetak "ya" dan kondisinya menjadi benar.
Berbeda dengan menggunakan operator kesetaraan file -ef
ini akan menelurkan proses baru.