Mengapa sed -i
dieksekusi pada symlink menghancurkan tautan itu dan menggantinya dengan file tujuan? Bagaimana cara menghindarinya?
misalnya.
$ ls -l pet*
-rw-rw-r-- 1 madneon madneon 4 mar 23 16:46 pet
lrwxrwxrwx 1 madneon madneon 6 mar 23 16:48 pet_link -> pet
$ sed -i 's/cat/dog/' pet_link
$ ls -l pet*
-rw-rw-r-- 1 madneon madneon 4 mar 23 16:48 pet
-rw-rw-r-- 1 madneon madneon 4 mar 23 16:49 pet_link
Dan mengapa itu tidak dianggap sebagai bug?
Ini bukan bug, ini adalah dengan desain karena
sed
merupakan S tream ED itor, bukan file editor. Itu pada dasarnya membuat salinan dan mengganti file asli dengan salinan. BashFAQAtau Anda dapat menggunakan
ex
perintah sebagai gantinya yang memiliki sintaksis yang sama untuk substitusi, misalnyaatau beberapa file:
Itu tidak akan menghancurkan tautan simbolik.
Terkait: Bagaimana cara mencegah sed dari menghancurkan hardinks?
sumber
Saya menemukan bahwa ini juga berfungsi dengan baik (menjaga hubungan simbolis dan keras):
sumber
Ada solusi yang terkadang kita gunakan untuk menulis ke file yang sama dengan yang dibaca. Berikut adalah kutipan dari halaman manual:
Berikut ini cuplikan yang menunjukkan bahwa ia dapat mempertahankan tautan simbolik, meskipun saya biasanya menggunakannya untuk menyimpan inode:
yang menghasilkan:
Pada sistem seperti:
Kode spons tersedia dalam paket moreutils - beberapa detail:
Di toko kami, kami menulis versi yang menulis ke file sementara untuk kasus file yang sangat besar.
Paket ini tersedia di Debian, Fedora, macOS (via minuman), dll. ... tepuk tangan,
sumber