Почему sed -i
выполняется по символической ссылке уничтожает эту ссылку и заменяет ее с целевым файлом? Как этого избежать?
например.
$ 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
И почему это не считается ошибкой?
Это не ошибка, это дизайн, так
sed
как это S- tream ED itor , а не редактор файлов. Он в основном делает копию и заменяет оригинальный файл копией. BashFAQВ качестве альтернативы вы можете использовать
ex
команду, которая имеет аналогичный синтаксис для замены, напримерили несколько файлов:
Это не разрушит символические ссылки.
Связанный: Как я могу препятствовать тому, чтобы sed разрушил hardinks?
источник
Я считаю, что это также хорошо работает (сохраняя как символические, так и жесткие ссылки):
источник
Существует решение, которое мы иногда используем для записи в тот же файл, из которого выполняется чтение. Вот выдержка из справочной страницы:
Вот фрагмент, который показывает, что он может сохранять символические ссылки, хотя я обычно использую его для сохранения inode:
который производит:
В такой системе, как:
Код губки доступен в пакете moreutils - некоторые подробности:
В нашем магазине мы написали версию, которая записывает во временный файл для случая очень больших файлов.
Пакет доступен на Debian, Fedora, macOS (через brew) и т. Д. ... ура,
источник