Co oznacza modyfikacja pliku „na miejscu”, np. Za pośrednictwem sed -i
lub perl -i
?
Moje pytanie dotyczy sposobu wykonania tej modyfikacji w miejscu. Czy plik został skopiowany, modyfikacja jest wykonywana w kopii, a następnie zastępowana jest oryginalna? A może oryginalny plik jest jakoś modyfikowany?
10
ex
lubvi
?ex
utrzymuje plik poczty (jakdead.mail
lub coś w ~ tobie, i zwykle inny gdzieś w pobliżu bufora poczty) . sprawdź specyfikację - każda z nich ma zdefiniowany stan do dużych długości ...ex
w większości przypadków ma swój własny format binarny (spójrz na-rescue
plik) i służy to do prezerowania oddzielnych plików tymczasowych buforów (być może nawet sześciu) . więc czy kopiują bloki danych wejściowych do edycji buforów i synchronizują zapisy do przesunięć na zmiany:!written
?Odpowiedzi:
sed
tworzy plik tymczasowy, zapisuje dane wyjściowe w tym pliku, a następnie zmienia nazwę pliku tymczasowego na górną część oryginału.Możesz obserwować, co się dzieje, używając
strace
:Rejestruje wszystkie operacje na plikach
sed
: tworzy nowy plik (bezpiecznie zO_CREAT|O_EXCL
), zapisuje w nim dane, a następnie przenosi go z powrotem na wierzch mojego oryginalnego plikua
.sed -i
akceptuje sufiks do użycia jako kopii zapasowej, w takim przypadku najpierw usuwa oryginał (zamiast zmiany nazwy na wierzch). Argument ten jest obowiązkowy w większości BSDsed
. W takim przypadku w katalogu nie ma w ogóle pliku o właściwej nazwie.perl
w najnowszych wersjach otwiera plik wejściowy, a następnie usuwa go i tworzy nowy plik o tej samej nazwie:Po usunięciu (
unlink
) pliku, który już otworzyłeś, masz do niego dostęp tak długo, jak długo trzymasz uchwyt, aby mógł nadal odczytywać dane z usuniętego pliku. W ten sposóbperl
pisze bezpośrednio do pliku wyjściowego, zamiast do pliku tymczasowego: żaden dodatkowy plik jest tworzony, ale jeśli odczytać pliku podczas procesu dostaniesz częściowe treści, w przeciwieństwie dosed
„s podejście. Jest też krótki czas, kiedy nie ma pliku o właściwej nazwie, który jest na początku procesu, a nie na końcu (jak wsed -i .bak
).Zarówno
sed
iperl
będzie:setgid
bit), jeśli był własnością grupy, w której nie jesteś i nie jesteś rootem.setuid
isetgrp
bity, jeśli wynikowa grupa jest taka sama jak grupa, w której zaczął.sed
będzie:perl
będzie:Powyższe dotyczy prawdy w systemie Linux z GNU
sed
i Mac OS X z (pochodzącym z FreeBSD)sed
.źródło
Oprócz odpowiedzi na @ Homer od
perldoc perlrun
:I pamiętaj, że nie zostaje zachowany żaden link miękki lub link twardy:
Wyjaśnia to również, dlaczego należy używać
-i
z-p
opcją lub użyć jawnejprint
instrukcji, jeśli chcesz edytować w miejscu za pomocąperl
:źródło