W tym celu stworzono narzędzie:
truncate -s 0 filename
Spowoduje to wyczyszczenie zawartości, ale nadal będzie to ten sam plik (i- węzeł pozostaje taki sam).
Jest to ważne, ponieważ niektóre programy trzymają uchwyt pliku „przez i-węzeł”. Załóżmy, że „opróżniłeś” plik przy użyciu naiwnej metody usuwania i ponownego tworzenia pliku. Niektóre programy mogą nadal trzymać uchwyt starego pliku (ze starą zawartością), nawet jeśli nie jest już widoczny zwykłymi środkami ls.
Niektóre linki do bardziej szczegółowych informacji na końcu tej odpowiedzi.
Innym sposobem, może łatwiejszym do zapamiętania:
echo -n > filename
To także utrzymuje ten sam i-węzeł.
Należy zauważyć, że zarówno truncatei echo -nnie są zdefiniowane przez POSIX .
W celu zachowania zgodności z POSIX cat /dev/null:
cat /dev/null > filename
Jeszcze inny sposób, bardziej niejasny i prawdopodobnie nie zależny od powłoki:
> filename
Jeśli plik do obcięcia wymaga uprawnień administratora do zapisu, następujące linie nie będą działać zgodnie z oczekiwaniami:
sudo echo -n > filename
sudo cat /dev/null > filename
sudo > filename
Dzieje się tak, ponieważ przekierowanie jest wykonywane przez powłokę jeszcze przed uruchomieniem sudo. Oznacza to, że dostęp do zapisu do pliku odbywa się przy użyciu uprawnień użytkownika, który uruchamia powłokę, a nie uprawnień, które zostaną przyznane przez sudo.
Obejściem tego problemu jest odroczenie przekierowania do powłoki wykonanej przy użyciu uprawnień sudo:
sudo sh -c "echo -n > filename"
Korzystanie z truncateciebie nie wymaga takiego obejścia, ponieważ dostęp do zapisu nie jest wykonywany przez powłokę, ale przez truncatektóry jest wykonywany przez sudo przy użyciu uprawnień sudo.
sudo truncate -s 0 filename
Aby uzyskać szczegółowe informacje o programach, które utrzymują otwarty plik, nawet jeśli plik został usunięty, możesz przeczytać:
tail -n +1000 file.txt > file.txtnależy usunąć 1000 wierszy i zachować najnowsze wiersze w pliku (nigdy nie wiadomo, kiedy może być potrzebny jakiś najnowszy rekord do śledzenia czegoś).