Dlaczego sed -i
wykonanie na dowiązaniu symbolicznym niszczy to łącze i zastępuje je plikiem docelowym? Jak tego uniknąć?
na przykład.
$ 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
I dlaczego nie jest to uważane za błąd?
To nie jest błąd,
sed
jest to zgodne z projektem, ponieważ jest to wersja S tream ED , a nie edytor plików. Zasadniczo tworzy kopię i zastępuje oryginalny plik kopią. BashFAQZamiast tego możesz użyć
ex
polecenia, które ma podobną składnię do podstawienia, nplub wiele plików:
Nie zniszczy symbolicznych linków.
Powiązane: Jak zapobiec sed niszczyć hardinks?
źródło
Uważam, że to również działa dobrze (zachowując zarówno dowiązania symboliczne, jak i twarde):
źródło
Istnieje rozwiązanie, którego czasami używamy do zapisu do tego samego pliku, z którego jest on odczytywany. Oto fragment strony man:
Oto fragment kodu, który pokazuje, że może zachować dowiązania symboliczne, chociaż zwykle używam go do zachowania i-węzłów:
który produkuje:
W systemie takim jak:
Kod gąbki jest dostępny w pakiecie moreutils - niektóre szczegóły:
W naszym sklepie napisaliśmy wersję, która zapisuje plik tymczasowy w przypadku bardzo dużych plików.
Pakiet jest dostępny na Debianie, Fedorze, macOS (poprzez napar) itp. ... Pozdrawiam,
źródło