Pregunta:
¿Por qué sed -i
ejecutado en un enlace simbólico destruye ese enlace y lo reemplaza con el archivo de destino? ¿Cómo evitar esto?
p.ej.
$ 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
¿Y por qué no se considera un error?
Respuesta:
La -i
/ --in-place
edita un archivo en su lugar. De forma predeterminada, sed
lee el archivo dado, lo procesa y lo convierte en un archivo temporal, luego copia el archivo temporal sobre el original, sin verificar si el original era un enlace simbólico.
GNU sed
tiene un --follow-symlinks
, que hace que se comporte como usted quiere:
$ echo "cat" > pet
$ ln --symbolic pet pet_link
$ sed --in-place --follow-symlinks 's/cat/dog/' pet_link
$ cat pet
dog