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?

Andrzej
źródło

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 .

maniak
źródło
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

nie? Nie
źródło
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).

Thechickenmoo
źródło
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.

Stuart P. Bentley
źródło
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

Brian Wigginton
źródło
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.

Soum
źródło
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
dmckee
źródło
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
4

Poniższe polecenie powinno również działać:

cat /dev/null > file.log
paarth batra
źródło
1

Kilka alternatyw:

ex +%d -scwq file.log
cp /dev/null file.log
vi +%d -escwq file.log
install -m600 /dev/null file.log
kenorb
źródło
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ą).

d491049
źródło
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).

Phoshi
źródło
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
Morgan
źródło
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.

Domeny Wyróżnione
źródło
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.

użytkownik1021769
źródło