Warum zerstört die sed -i
Ausführung von symlink diesen Link und ersetzt ihn durch die Zieldatei? Wie vermeide ich das?
z.B.
$ 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
Und warum wird es nicht als Fehler angesehen?
Es ist kein Fehler, dies ist beabsichtigt, da
sed
es sich um einen S tream- ED- Editor handelt, nicht um einen Datei-Editor. Grundsätzlich wird eine Kopie erstellt und die Originaldatei durch die Kopie ersetzt. BashFAQAlternativ können Sie auch einen
ex
Befehl verwenden, der eine ähnliche Syntax für die Ersetzung aufweist, zoder mehrere Dateien:
Die symbolischen Links werden nicht zerstört.
Siehe auch : Wie verhindere ich, dass sed Hardinks zerstört?
quelle
Ich finde, dass dies auch gut funktioniert (wobei sowohl symbolische als auch harte Links erhalten bleiben):
quelle
Es gibt eine Lösung, die wir manchmal verwenden, um in dieselbe Datei zu schreiben, aus der gelesen wird. Hier ist ein Auszug aus der Manpage:
Hier ist ein Ausschnitt, der zeigt, dass symbolische Verknüpfungen erhalten bleiben können, obwohl ich ihn normalerweise verwende, um Inodes zu erhalten:
welche produziert:
Auf einem System wie:
Der Schwammcode ist im Paket moreutils enthalten - einige Details:
In unserem Shop haben wir eine Version geschrieben, die bei sehr großen Dateien in eine temporäre Datei schreibt.
Das Paket ist auf Debian, Fedora, macOS (via brew) usw. verfügbar.
quelle