Jak wyczyścić zawartość pliku z wiersza poleceń?


280

Mam plik dziennika zawierający wiele rzeczy, których już nie potrzebuję. Chcę wyczyścić zawartość.

Wiem, jak wydrukować zawartość na ekranie:

cat file.log

Wiem, jak edytować plik, linia po linii:

nano file.log

Ale nie chcę usuwać każdej linii pojedynczo. Czy można to zrobić za pomocą jednego polecenia bez niszczenia pliku?

Odpowiedzi:


465

Tylko w bashu

> filename

zrobi.

Zostanie ci pusta nazwa pliku .

ps

Jeśli potrzebujesz sudopołączenia, rozważ skorzystanie z tego, truncateco odebrano tutaj .


57
Jest to prawdopodobnie najdelikatniejsze polecenie w historii komputerów
blarg

7
Przeciwnie, @ Arekkusandaa.Irujasukin; działa dobrze w każdej wersji systemu Windows, o ile, jak wspomniano, używasz bashjako swojej powłoki, a nie np. cmd.exelub PowerShell, z których żaden nie jest na tyle POSIXY, aby można było obsłużyć takie rzeczy.
DopeGhoti

124

Możesz użyć polecenia użytkownika: obciąć

truncate -s 0 test.txt

(„-s 0”, aby określić rozmiar)

http://www.commandlinefu.com/commands/view/12/empty-a-file


3
Najlepsza odpowiedź, działa, gdy nie jesteś rootem (z sudo) - sudo echo > filepo prostu daje błąd w takich przypadkach.
Dmitrij Verkhoturov

12
@DmitryVerkhoturov: sudo bash -c '> filename'to sposób korzystania z rozwiązań Bash w sudo.
Stuart P. Bentley,

1
brew install truncatena OS X z zainstalowanym Homebrew.
xaxxon

Działa szybciej niż echo
Miao1007,

34

Możesz to zrobić:

echo -n "" > file.log

Używanie >do zapisu (zerowego) wejścia echo -ndo pliku.

Użycie >>spowoduje dołączenie do pliku danych wejściowych o wartości zerowej (efektywnie nic nie robiąc, tylko touchje ing).


To pozostawi miejsce.
dmckee

Dostaję to: -bash:: polecenie nie znaleziono
Andrew

3
echo „”> nadal da ci plik z jednym znakiem (nowy wiersz). Jeśli chcesz użyć echa, użyj „echo -n> file.log”, aby echo było puste.
Dave Forgac

Lepiej byłoby użyć dedykowanego polecenia o zerowym wyjściu, takiego jak true(lub jego wbudowany alias :), chociaż ostatecznie wcale nie potrzebujesz polecenia (zobacz zaakceptowaną odpowiedź).
Stuart P. Bentley,

Możesz mieć problemy z sudo.
flapjack

27
: > file.log

Taki sam jak > filenamew Bash, ale działa w większej ilości powłok (kredyt) . Przekierowuje wyjście z truewbudowanego (który nie ma wyjścia) do filename.


Przyszedłem udzielić tej odpowiedzi, ale niestety już tu jest ... Weź głos.
Aaron Hall

5
Po prostu zrób :> filename. Czy to nie wygląda jak buźka? :>
minmaxavg

10

ZSH

>! filename

ZSH ochroni użytkowników przed zapychaniem plików za pomocą operatora przekierowania io >. Jeśli używasz >!, możesz wymusić obcięcie istniejącego pliku.

Jeśli chcesz, aby ZSH używał zachowania przekierowującego Basha, gdyby nie było ochrony przed blokowaniem plików, musisz ustawić clobberopcję dla swojej powłoki.

Więcej informacji: http://zsh.sourceforge.net/Doc/Release/Redirection.html


8

JEŚLI chcesz to zrobić z poziomu edytora vim w wierszu poleceń, możesz spróbować:

vim file.txt 

Prasa Esc.

:1,$d

Prasa Enter.

Wszystkie linie zostaną usunięte.


To jedyna rzecz, która zadziałała dla mnie maillog, nawet jej sudo > /var/log/maillognie wyczyściłam (odmowa zgody)
bobobobo

2
@bobobobo Nie działa to jak należy sudo > /var/log/maillog- uruchom sudo i umieść dane wyjściowe w pliku. Oczywiście stawia dane wyjściowe z bieżącymi uprawnieniami użytkownika. Łatwiej zrobić, sudo suaby uruchomić root root, a następnie zrobić > /var/log/maillog.
kan

4
$ rm file.log; touch file.log

lub

$ cat > file.log

a następnie control-d.

lub ... lub ... lub ...

Ach Oto wersja z jednym poleceniem:

$ dd if=/dev/null of=file.log

2
Sugestia Thechickenmoo echo "" > file.logjest lepsza niż catpokazana opcja, w tej sytuacji są inne, które catsą bardziej odpowiednie. oba używają tego samego przekierowania pocisku, aby wykonać ciężkie podnoszenie.
szarlatan

2
Nie musisz uruchamiać polecenia cat. Wystarczy „> plik.log”.
camh

Usunięcie pliku spowoduje zresetowanie daty utworzenia.
Matteo,

Usunięcie pliku spowoduje, że programy oglądające ten plik stracą do niego wskaźnik (tj. Będzie miał nowy adres w systemie plików). Mówiąc ogólnie, tak rmwykona zadanie utworzenia pustego pliku o tej samej nazwie. Ale to nie będzie odpowiednie dla każdego przypadku użycia.
Robert



1

Kilka alternatyw:

ex +%d -scwq file.log
cp /dev/null file.log
vi +%d -escwq file.log
install -m600 /dev/null file.log

1

Jeśli masz spacje w nazwach plików, użyj:

for file in /path/to/file/*; do > "$file"; done

(Nie mogłem zawrzeć go w komentarzach do poprzedniej odpowiedzi, ponieważ nie mam 50 reputacji. Czasami ograniczenia są sprzeczne z produktywnością).


0

Jedna linia na raz?

Wypróbuj vi (m), piękny edytor tekstu, który potrafi wszystko. W takim przypadku przejdź do linii, naciśnij d (aby usunąć) i d ponownie (dla linii).


5
Jeśli chcesz pozbyć się całego pliku w vimie, z kursorem u góry dokumentu, wpisanie d G (to d, następnie shift-G) spowoduje usunięcie całego pliku (d dla usunięcia, G dla końca plik). Wolę jednak twoją metodę (daje mi to więcej czasu na zastanowienie się, czy NAPRAWDĘ chcę wyrzucić plik).
Babu

@Babu ggprzesuwa się na górę, aby cała sekwencja mogła być ggdG.
Bob

0

Z moimi uprawnieniami jest to jedyna rzecz, która działała:

touch temp.txt
sudo mv temp.txt original-file.txt

0

Ponadto, jeśli masz wiele plików, możesz użyć następujących opcji:

for file in /path/to/file/*; do > $file; done

Jest to pomocne w przypadku plików dziennika w tym samym katalogu.


0

> a.txt

To samo co> nazwa pliku w Bash, ale działa w większej liczbie powłok (kredyt). Przekierowuje dane wyjściowe z prawdziwego wbudowanego (który nie ma danych wyjściowych) do nazwy pliku.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.