Znam trzy metody usuwania wszystkich wpisów z pliku.
Oni są
>filename
touch filename
filename < /dev/null
Z tych trzech >filename
najbardziej nadużywam, ponieważ wymaga to najmniejszej liczby naciśnięć klawiszy.
Chciałbym jednak wiedzieć, która z nich jest najbardziej wydajna (jeśli istnieją bardziej wydajne metody) w odniesieniu do dużych plików dziennika i małych plików.
Jak działają te trzy kody i usuwają zawartość?
shell-script
files
debal
źródło
źródło
truncate -s 0 filename
?Odpowiedzi:
W rzeczywistości druga forma
touch filename
nie usuwa niczego z pliku - tworzy pusty plik, jeśli nie istnieje, lub aktualizuje datę ostatniej modyfikacji istniejącego pliku.A trzeci
filename < /dev/null
próbuje uruchomić nazwę pliku z danymi/dev/null
wejściowymi.cp /dev/null filename
Pracuje.Jeśli chodzi o wydajność, najbardziej wydajna byłaby
truncate -s 0 filename
; patrz tutaj: http://linux.die.net/man/1/truncate .W przeciwnym razie,
cp /dev/null filename
lub> filename
oba są w porządku. Obie otwierają, a następnie zamykają plik, korzystając z ustawienia obcinania przy otwieraniu.cp
otwiera się również/dev/null
, dzięki czemu jest nieznacznie wolniejszy.Z drugiej strony
truncate
prawdopodobnie byłby wolniejszy niż> filename
podczas uruchamiania ze skryptu, ponieważ uruchomienie komendy truncate wymaga, aby system otworzył plik wykonywalny, załadował go i uruchomił.źródło
truncate
jest to najbardziej wydajny?> filename
muszą wywoływać procesory i metody.truncate(2)
tego nie robi.touch filename
, czy i-węzeł pozostanie taki sam (pod warunkiem, że wcześniej istniał plik)?ls -i
Inną opcją może być:
Ze strony podręcznika użytkownika
echo
:źródło
Istnieje wbudowane polecenie „:”, które może być dostępne w sh, csh, bash i innych, które można łatwo wykorzystać z przekierowującym operatorem wyjściowym,
>
skracając plik:Podoba mi się to, że nie potrzebuje żadnych zewnętrznych poleceń, takich jak „echo” itp.
Jedną wielką zaletą obcięcia plików zamiast ich usuwania / odtwarzania jest to, że działające aplikacje, które działają z tym plikiem (np. Ktoś tworzy
tail -f filename
oprogramowanie monitorujące lub ...) nie muszą go ponownie otwierać. Mogą po prostu kontynuować korzystanie z filedescriptor i pobierać wszystkie nowe dane.źródło
man bash
opisuje:
wbudowaną powłokę jako niedziałającą.>
do pliku, który tworzy plik, jeśli nie istnieje, a jeśli istnieje, przycinasz go do zera. Lepiej powiedz: używasz tego,:
aby nic nie robić, i używać>
do przekierowywania niczego do pliku i obcinania go.> file
wystarczy obciąć plik. Nie potrzebujesz żadnego polecenia, tylko operator przekierowania.> filename
nie działa. na przykład w zsh. ale: > filename
nadal działa.> myfile
ale np. Błędy csh z: Niepoprawne polecenie null.