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?

Andrew
quelle

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 .

Aussenseiter
quelle
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

nono
quelle
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).

Thechickenmoo
quelle
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.

Stuart P. Bentley
quelle
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

Brian Wigginton
quelle
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.

soum
quelle
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
dmckee
quelle
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
4

Der folgende Befehl sollte auch funktionieren:

cat /dev/null > file.log
Paarth Batra
quelle
2

Wenn Sie die Berechtigung sudo to superuser benötigen, um auf die Datei zuzugreifen, funktioniert die akzeptierte Antwort nicht. Dies funktioniert folgendermaßen:

truncate -s0 file

oder explizit mit sudo:

sudo truncate -s0 file

Weitere Informationen finden Sie hier http://www.commandlinefu.com/commands/view/12/empty-a-file

Zeitschmied
quelle
1

Einige Alternativen:

ex +%d -scwq file.log
cp /dev/null file.log
vi +%d -escwq file.log
install -m600 /dev/null file.log
Kenorb
quelle
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.)

d491049
quelle
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).

Phoshi
quelle
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
Morgan
quelle
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.

DomainsFeatured
quelle
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.

user1021769
quelle