¿Qué significa la modificación "in situ" de un archivo, por ejemplo, vía sed -io perl -isignifica?
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

exovi?exmantiene un archivo de correo (como,dead.mailo 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 ...extiene su propio formato binario en la mayoría de los casos (mire su-rescuearchivo) 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:
sedcrea 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 -iacepta 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.perlen 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,perlescribe 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 diferenciaseddel 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
sedy loperlharán:setgidbit) si era propiedad de un grupo en el que no está y no es root.setuidysetgrpbits, si el grupo resultante es el mismo que el grupo en el que comenzó.sedserá:perlserá:Lo anterior es cierto en Linux con GNU
sedy 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
-icon la-popción, o utilizar una explícitaprintdeclaración si desea editar in-situ conperl:fuente