¿Qué significa la modificación "in situ" de un archivo, por ejemplo, vía sed -i
o perl -i
significa?
Mi pregunta es sobre cómo se realiza esta modificación in situ. ¿Se copia el archivo, la modificación se realiza en la copia y luego se reemplaza el original? ¿O se está modificando de alguna manera el archivo original?
10
ex
ovi
?ex
mantiene un archivo de correo (como,dead.mail
o algo en usted, y otro en algún lugar cerca de su cola de correo, por lo general) . verifique las especificaciones: cada una de ellas tiene un estado definido a grandes longitudes ...ex
tiene su propio formato binario en la mayoría de los casos (mire su-rescue
archivo) y esto se usa para precerrar por separado los archivos de búfer temporales (posiblemente hasta seis) . Entonces, ¿estos bloques de entrada de copia para editar buffers y sincronizar escrituras en compensaciones por cambios:!written
?Respuestas:
sed
crea un archivo temporal, escribe el resultado en ese archivo y luego cambia el nombre del archivo temporal sobre la parte superior del original.Puedes ver lo que sucede usando
strace
:Esto registra todas las operaciones de archivo
sed
: crea un nuevo archivo (de forma segura conO_CREAT|O_EXCL
), escribe los datos en él y luego lo mueve de nuevo sobre la parte superior de mi archivo originala
.sed -i
acepta un sufijo para usar como copia de seguridad y, en ese caso, primero quita el original (en lugar de renombrarlo en la parte superior). Ese argumento es obligatorio en la mayoría de los BSDsed
. En este caso, hay un breve momento en el que no hay ningún archivo con el nombre correcto en el directorio.perl
en versiones recientes abre el archivo de entrada, luego lo elimina y crea un nuevo archivo con el mismo nombre:Cuando elimina (
unlink
) un archivo que ya tiene abierto, conserva el acceso al mismo mientras mantenga el control, para que pueda seguir leyendo los datos del archivo eliminado. De esta manera,perl
escribe directamente en el archivo de salida, en lugar de hacerlo en un archivo temporal: no se crea ningún archivo adicional, pero si lee el archivo durante el proceso, obtendrá contenido parcial, a diferenciased
del enfoque. También hay un breve momento en el que no hay un archivo con el nombre correcto, que se encuentra al comienzo del proceso en lugar de al final (como ensed -i .bak
).Ambos
sed
y loperl
harán:setgid
bit) si era propiedad de un grupo en el que no está y no es root.setuid
ysetgrp
bits, si el grupo resultante es el mismo que el grupo en el que comenzó.sed
será:perl
será:Lo anterior es cierto en Linux con GNU
sed
y Mac OS X con su (derivado de FreeBSD)sed
.fuente
Además de la respuesta de @ Homer, de
perldoc perlrun
:Y recuerde que no se conserva ningún enlace suave o enlace duro:
Esto también explica por qué debe utilizar
-i
con la-p
opción, o utilizar una explícitaprint
declaración si desea editar in-situ conperl
:fuente