Czy jestem ślepy czy nie ma takiej opcji jak --in-place
dla sort
?
Aby zapisać wyniki w pliku wejściowym, sed używa -i
( --in-place
).
Przekierowanie wyjścia sort
do pliku wejściowego
sort < f > f
powoduje, że jest pusty. Jeśli nie ma --in-place
opcji - może jest jakaś sztuczka, jak to zrobić w poręczny sposób?
(Jedyne, co przychodzi mi do głowy:
sort < f > /tmp/f$$ ; cat /tmp/f$$ > f ; rm /tmp/f$$
Przenoszenie nie jest właściwym wyborem, ponieważ uprawnienia do plików mogą ulec zmianie. Dlatego nadpisuję zawartość pliku tymczasowego, który następnie usuwam.)
text-processing
sort
Grzegorz Wierzowiecki
źródło
źródło
insitu
możliwość używania dowolnych poleceń w miejscu.sort
.Odpowiedzi:
sort
ma-o, --output
opcję, która przyjmuje nazwę pliku jako argument. Jeśli jest taki sam jak plik wejściowy, zapisuje wynik do pliku tymczasowego, a następnie zastępuje oryginalny plik wejściowy (dokładnie to samo, cosed -i
robi).Ze
GNU sort
strony informacyjnej:oraz ze specyfikacji bazowej Open Group Problem 7 :
źródło
man sort
- czy jest to funkcja nieudokumentowana? Czy to jest standardowe i przenośne?sort -o <filename> <filename>
bezpiecznie posortuje plik na miejscu.Możesz użyć
sponge
funkcji, która najpierw nasiąka,stdin
a następnie zapisuje ją do pliku, na przykład:Minusem
sponge
jest to, że będzie przechowywać dane tymczasowe w pamięci, co może być problematyczne w przypadku dużych plików. W przeciwnym razie musisz najpierw zapisać plik, a następnie nadpisać oryginalny plik.Jak jednak wskazują inne odpowiedzi, modyfikacje w miejscu nie są ogólnie dobrym pomysłem, ponieważ w trakcie procesu (na przykład tego
sponge
) maszyna może ulec awarii, a następnie można utracić zarówno oryginalny, jak i nowy plik. Lepiej najpierw napisz go do innego pliku, a następnie użyj instrukcji atomowejmv
(przenieś).źródło
Zastąpienie pliku wejściowego plikiem wyjściowym jest niebezpieczne, ponieważ jeśli program lub system ulegnie awarii podczas zapisywania pliku, utracisz oba.
Kilka programów (głównie wersje GNU) ma opcję na miejscu (np.
-i
Na perlu i GNU sed;-o
na sortowaniu GNU). Działają, umieszczając dane w pliku tymczasowym, a następnie przenosząc je na miejsce. Dla programów, które nie mają takiej możliwości, Colin Watsonsponge
narzędzie (wliczone w moreutils Joey Hessa ) spełnia swoje zadanie bezpiecznie dla każdego programu (przykłady: mogę zrobićcut
? Zmienić plik na swoim miejscu ; Jak mogę dokonać iconv zastąpić plik wejściowy z konwersją wyjście? ).Tylko w tych rzadkich przypadkach, w których nie można odtworzyć oryginalnego pliku z tymi samymi uprawnieniami, zalecam zastąpienie tego pliku. W takim przypadku lepiej gdzieś zapisać oryginalne dane wejściowe. Następnie możesz po prostu przetworzyć kopię danych wejściowych i wysłać ją do oryginalnego pliku.
źródło
sort -o
nie jest specyficzny dla GNU i jest specjalnie zaprojektowany do lub przywracania pliku w miejscu.sort
nie może zacząć zapisywać danych wyjściowych, zanim w pełni nie odczyta danych wejściowych (używa pamięci lub plików tymczasowych do przechowywania danych), więc jest całkiem naturalne, że powinno być w stanie zastąpić dane wejściowe.sort
nie jest POSIX-em, ponieważsort -mo file1 file1 file2
nie ma gwarancji, że zadziała, podczas gdy tradycyjnisort
wiedzą, jak to obejść (już w Unixie V7 w latach 70.).sort -o
działa dla mnie z coreutils 8.25, a właściwość jest udokumentowana w instrukcji (zauważając, że ma to miejsce tylko podczas sortowania, a nie podczas scalania). Jeśli możesz to odtworzyć, wyślij raport o błędzie (wskazujący dokładny wiersz poleceń, dokładny plik (pliki) wejściowe, system, na którym go uruchomiłeś i sposób uzyskania pliku binarnego).Użyj
-o
lub wypróbuj vim-way:źródło