Was bedeutet die "Inplace" -Modifikation einer Datei, zB via sed -i
oder perl -i
?
Meine Frage ist, wie diese Inplace-Änderung durchgeführt wird. Wird die Datei kopiert, erfolgt die Änderung in der Kopie und ersetzt dann das Original? Oder wird die Originaldatei irgendwie geändert?
10
ex
odervi
?ex
verwaltet eine Mail-Datei (wiedead.mail
oder etwas in ~ Ihnen und eine andere in der Nähe Ihres Mail-Spoolers, normalerweise) . Überprüfen Sie die Spezifikationen - jeder von ihnen hat einen zu großen Längen definierten Status ...ex
hat in den meisten Fällen ein eigenes Binärformat (siehe Ihre-rescue
Datei) und wird verwendet, um separate temporäre Pufferdateien (möglicherweise bis zu sechs) vor Null zu setzen . Also kopieren diese Eingabeblöcke, um Puffer zu bearbeiten und Schreibvorgänge pro Änderung in Offsets zu synchronisieren:!written
?Antworten:
sed
Erstellt eine temporäre Datei, schreibt die Ausgabe in diese Datei und benennt die temporäre Datei über dem Original um.Sie können beobachten, was passiert, indem Sie
strace
:Dies protokolliert alle Dateivorgänge
sed
: Es erstellt eine neue Datei (sicher mitO_CREAT|O_EXCL
), schreibt die Daten in sie und verschiebt sie dann wieder über meine ursprüngliche Dateia
.sed -i
Akzeptiert ein Suffix, das für eine Sicherung verwendet werden soll. In diesem Fall wird das Original zuerst aus dem Weg geräumt (anstatt es umzubenennen). Dieses Argument ist in den meisten BSDs obligatorischsed
. In diesem Fall gibt es eine kurze Zeit, in der sich überhaupt keine Datei mit dem richtigen Namen im Verzeichnis befindet.perl
In neueren Versionen wird die Eingabedatei geöffnet, dann gelöscht und eine neue Datei mit demselben Namen erstellt:Wenn Sie
unlink
eine bereits geöffnete Datei löschen ( ), behalten Sie den Zugriff darauf, solange Sie das Handle behalten, damit die Daten aus der gelöschten Datei weiter gelesen werden können. Auf diese Weise wirdperl
direkt in die Ausgabedatei und nicht in eine temporäre Datei geschrieben: Es wird keine zusätzliche Datei erstellt. Wenn Sie die Datei jedoch während des Vorgangs lesen, erhalten Sie im Gegensatz zumsed
Ansatz von partiellen Inhalt . Es gibt auch eine kurze Zeit, in der es keine Datei mit dem richtigen Namen gibt, die sich eher am Anfang des Prozesses als am Ende befindet (wie insed -i .bak
).Beides
sed
undperl
wird:setgid
Bit enthält), wenn sie einer Gruppe gehört, in der Sie sich nicht befinden, und Sie sich nicht im Stammverzeichnis befinden.setuid
undsetgrp
Bits, wenn die resultierende Gruppe mit der Gruppe übereinstimmt, in der sie gestartet wurde.sed
werden:perl
werden:Dies gilt unter Linux mit GNU
sed
und Mac OS X mit (von FreeBSD abgeleitet)sed
.quelle
Zusätzlich zu @ Homers Antwort von
perldoc perlrun
:Und denken Sie daran, dass kein Softlink oder Hardlink erhalten bleibt:
Dies erklärt auch, warum Sie
-i
mit-p
Option oder eine expliziteprint
Anweisung verwenden müssen, wenn Sie anstelle von bearbeiten möchtenperl
:quelle