Wie lösche ich den Inhalt einer Datei über die Befehlszeile?


280

Ich habe eine Protokolldatei, die eine Menge Dinge enthält, die ich nicht mehr brauche. Ich möchte den Inhalt löschen.

Ich kann den Inhalt auf dem Bildschirm ausdrucken:

cat file.log

Ich kann die Datei Zeile für Zeile bearbeiten:

nano file.log

Ich möchte jedoch nicht jede Zeile einzeln löschen. Gibt es eine Möglichkeit, es in einem Befehl zu tun, ohne die Datei zu zerstören, um es zu tun?

Antworten:


465

In Bash, nur

> filename

Wird besorgt.

Dies wird Sie mit einer leeren Datei Dateiname verlassen .

ps

Wenn Sie sudoanrufen, beachten Sie bitte zu verwenden , truncatewie hier beantwortet .


57
Dies ist wahrscheinlich der radikalste Befehl in der Geschichte des Computing
blarg

7
Im Gegenteil, @ Arekkusandaa.Irujasukin; Es funktioniert einwandfrei in jeder Windows-Version, solange Sie, wie bereits erwähnt, bashals Shell und nicht z. B. cmd.exeoder PowerShell verwenden, von denen keines POSIXy genug ist, um solche Aufgaben zu bewältigen.
DopeGhoti

124

Sie können den Befehl user verwenden: truncate

truncate -s 0 test.txt

("-s 0" zur Angabe der Größe)

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


3
Beste Antwort: Funktioniert, wenn Sie kein Root-Benutzer sind (mit sudo) - sudo echo > filein solchen Fällen wird nur ein Fehler ausgegeben.
Dmitry Verkhoturov

12
@DmitryVerkhoturov: sudo bash -c '> filename'So verwenden Sie die Bash-Lösungen mit sudo.
Stuart P. Bentley

1
brew install truncateunter os x mit installiertem homebrew.
Xaxxon

Funktioniert schneller als Echo
Miao1007

34

Sie könnten dies tun:

echo -n "" > file.log

Verwenden Sie >, um die (Null-) Eingabe von echo -nin die Datei zu schreiben .

Mit Hilfe >>würde fügt die Null Eingabe in die Datei (effektiv nichts zu tun , sondern touching es).


Dadurch bleibt dort ein Leerzeichen.
dmckee

Ich bekomme folgendes: -bash:: Befehl nicht gefunden
Andrew

3
echo ""> gibt Ihnen weiterhin eine Datei mit einem Zeichen (einem Zeilenumbruch). Wenn Sie echo verwenden möchten, geben Sie "echo -n> file.log" ein, um null auszugeben.
Dave Forgac

Es wäre besser, einen dedizierten Null-Ausgabebefehl wie true(oder seinen eingebauten Alias :) zu verwenden, obwohl Sie letztendlich überhaupt keinen Befehl benötigen (siehe die akzeptierte Antwort).
Stuart P. Bentley

Möglicherweise haben Sie Probleme mit sudo.
Flapjack

27
: > file.log

Entspricht > filenameBash, funktioniert aber mit mehr Muscheln (Kredit) . Leitet die Ausgabe von der trueeingebauten (die keine Ausgabe hat) zu filename.


Ich bin gekommen, um diese Antwort zu geben, aber leider ist sie schon da ...
Aaron Hall

5
Tu es einfach :> filename. Sieht es nicht aus wie ein Smiley? :>
minmaxavg

10

ZSH

>! filename

ZSH schützt Benutzer mit dem io-Redirect-Operator vor Datenverlust >. Wenn Sie verwenden >!, können Sie das Abschneiden einer vorhandenen Datei erzwingen.

Wenn Sie möchten, dass ZSH das Umleitungsverhalten von Bash verwendet, und kein Schutz vor Dateikollisionen besteht, müssen Sie die clobberOption für Ihre Shell festlegen .

Weitere Informationen: http://zsh.sourceforge.net/Doc/Release/Redirection.html


8

WENN Sie dies in einem VIM-Editor in der Befehlszeile tun möchten, können Sie dies versuchen:

vim file.txt 

Drücken Sie Esc.

:1,$d

Drücken Sie Enter.

Sie finden alle Zeilen gelöscht.


Dies ist das einzige, was für mich funktioniert hat maillog, auch sudo > /var/log/maillogwenn es nicht geklärt werden konnte (Erlaubnis verweigert)
Bobobobo

2
@bobobobo Es funktioniert nicht als sudo > /var/log/maillogMittel - starte sudo und füge seine Ausgabe in die Datei ein. Offensichtlich wird die Ausgabe mit den aktuellen Benutzerberechtigungen erstellt. Einfacher ist es sudo su, die Root-Shell zu starten und dann zu tun > /var/log/maillog.
Kan

4
$ rm file.log; touch file.log

oder

$ cat > file.log

gefolgt von control-d.

oder ... oder ... oder ...

Ah. Hier ist eine einzelne Befehlsversion:

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

2
Thechickenmoos Vorschlag echo "" > file.logist besser als die catOption, die Sie in dieser Situation zeigen, obwohl es andere gibt, bei denen dies catangemessener ist. Beide verwenden dieselbe Shell-Umleitung, um das schwere Heben durchzuführen.
Quacksalber 1.

2
Sie müssen den Befehl cat nicht ausführen. Nur "> file.log" wird es tun.
1.

Durch das Entfernen der Datei wird das Erstellungsdatum zurückgesetzt.
Matteo

Durch das Entfernen der Datei verlieren Programme, die diese Datei überwachen, ihren Zeiger darauf (dh, sie hat eine neue Adresse im Dateisystem). Im Allgemeinen rmerledigt yes die Aufgabe, eine leere Datei mit demselben Namen zu erstellen. Aber es wird nicht für jeden Anwendungsfall richtig sein.
Robert



1

Einige Alternativen:

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

1

Wenn Sie Leerzeichen in Dateinamen haben, verwenden Sie:

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

(Ich konnte es nicht in die Kommentare zur vorherigen Antwort aufnehmen, da ich keine Reputation von 50 habe. Manchmal sind Einschränkungen kontraproduktiv.)


0

Eine Zeile nach der anderen?

Versuchen Sie vi (m), den schönen Texteditor, der alles kann. Navigieren Sie in diesem Fall zu einer Zeile, drücken Sie d (zum Löschen) und d erneut (für die Zeile).


5
Wenn Sie die gesamte Datei in vim mit dem Cursor oben im Dokument entfernen möchten, wird durch Eingabe von d G (das ist d, dann Umschalt-G) die gesamte Datei gelöscht (d zum Löschen, G zum Ende des Dokuments) Datei). Ich bevorzuge jedoch Ihre Methode (es gibt mir mehr Zeit, darüber nachzudenken, ob ich die Datei WIRKLICH in den Papierkorb werfen möchte oder nicht).
Babu

@Babu ggbewegt sich nach oben, so dass die gesamte Sequenz sein könnte ggdG.
Bob

0

Mit meinen Berechtigungen ist dies das einzige, was funktioniert hat:

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

0

Wenn Sie mehrere Dateien haben, können Sie auch Folgendes verwenden:

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

Dies ist hilfreich für Protokolldateien im selben Verzeichnis.


0

> a.txt

Entspricht> Dateiname in Bash, funktioniert jedoch in mehreren Shells (Guthaben). Leitet die Ausgabe von True Builtin (das keine Ausgabe hat) nach Dateiname um.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.