Saya menjaga dotfile saya di bawah kontrol versi dan skrip yang menyebarkannya membuat tautan keras. Saya juga menggunakan etckeeper
untuk menempatkan /etc
kontrol versi di bawah saya . Baru-baru ini saya mendapat peringatan seperti ini:
warning: hard-linked files could cause problems with bzr
Salinan sederhana ( cp filename.ext filename.ext
) tidak akan berfungsi:
cp: `filename.ext' and `filename.ext' are the same file
Mengganti nama / memindahkan file - kecuali di seluruh volume - juga tidak merusak hard-link.
Jadi pertanyaan saya adalah: adakah cara untuk memutus tautan-keras ke suatu file tanpa benar-benar harus tahu di mana tautan-tautan lainnya ke file tersebut?
Jawaban:
Menjadikannya skrip:
Melakukan salinan terlebih dahulu, kemudian memindahkannya ke tempatnya, memiliki keuntungan bahwa file secara atom berubah dari menjadi tautan keras menjadi salinan terpisah (tidak ada titik waktu di mana
filename
sebagian atau hilang).sumber
Anda mungkin bermaksud memisahkan hard-link menjadi file yang terpisah dan independen.
Hardlink adalah koneksi antara entri dalam direktori dan blok inode pada disk.
inodes menyimpan meta-data file, dan untuk file kecil, beberapa sistem file menyimpan data dalam inode, jika tidak pointer ke blok data, dan untuk file yang sangat besar, tidak langsung dan daftar pointer ganda tidak langsung ke unit alokasi disk.
Apapun, koneksi antara nama file (Yang menghasilkan perintah ls) dan blok inode yang menyimpan meta-data ini, disebut hard link.
Memiliki banyak tautan keras ke satu file berarti inode yang sama dirujuk oleh lebih dari satu entri direktori, mungkin di direktori yang berbeda (pada sistem file tunggal)
rm menghapus entri nama file dari direktori. Setelah inode tidak lagi dirujuk oleh file apa pun, ruangnya dibebaskan untuk digunakan oleh file lain.
sumber
cp
danmv
contoh - contoh tersirat. Jadi tidak ada jalan lain menggunakan file sementara, saya mengerti.cp -a
(setidaknya GNU coreutils).Letakkan ini di akhir file ~ / .bashrc Anda.
Jalankan seperti ini
sumber
Cara terbaik untuk melakukannya dengan skrip bash adalah seperti ini:
poin yang perlu diperhatikan:
mktemp
untuk menghasilkan file yang dijamin tidak ada-f
untuk memaksa menimpa dan--preserve=all
untuk menjaga metadata semirip mungkin dengan file asli--
dan"
mengutip jalur yang berisi spasi dan / atau dimulai dengan-
Melakukan penggantian tanpa membuat file sementara tidak dimungkinkan dengan panggilan sistem linux saat ini (3.16): sementara dimungkinkan untuk menimpa file secara atom (yaitu, menghapus file lama dan ganti dengan yang baru sebagai operasi tunggal), itu tidak mungkin untuk melakukannya dengan file yang tidak memiliki nama pada sistem file (yaitu file sementara yang dibuat menggunakan
O_TMPFILE
flag ofopen
function) karenarename
fungsi tersebut memerlukan nama file sebagai input (tidak ada versirename
yang mengambil sebagai input deskriptor file - lihat di sini untuk detail)sumber
dirname
danmktemp
. Memperbaiki itu untuk Anda ...$( ... )
substitusi -style perintah. Salah satu alasannya lebih bagus daripada` ... `
gaya.`
Anda dimasukkan:`\``
(tentu saja, saya lolos dua kali untuk membuatnya menunjukkan kepada Anda apa yang Anda ketik).Perintah yang Anda cari adalah
unlink
sumber
cp
danmv
saya bermaksud menjelaskan bahwa saya ingin file itu ada sesudahnya.Jika Anda mencari semua nama file yang merupakan tautan ke file ini maka Anda dapat menggunakan:
juga
ls -il myknowhardlinkfile
akan menunjukkan jumlah nama file yang di-link ke inode yang sama (bidang ketiga).sumber