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?
In Bash, nur
> filename
wird besorgt.
Dies wird Sie mit einer leeren Datei Dateiname verlassen.
p.s.
Wenn Sie einen Sudo
-Aufruf benötigen, ziehen Sie bitte in Betracht, truncate
als hier beantwortet zu verwenden.
Sie können den Befehl user verwenden: truncate
truncate -s 0 test.txt
("-s 0" zur Angabe der Größe)
Sie könnten dies tun:
echo -n "" > file.log
Verwenden Sie >
, um die (Null-) Eingabe von echo -n
in die Datei zu schreiben.
Die Verwendung von >>
würde die NULL-Eingabe an die Datei anhängen (effektiv nichts anderes tun, als sie mit touch
zu benennen).
: > file.log
Entspricht > filename
in Bash, funktioniert jedoch in mehreren Shells (credit) . Leitet die Ausgabe der integrierten true
(die keine Ausgabe hat) zu filename
um.
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 ZSH das Umleitungsverhalten von Bash verwenden soll, müssen Sie die Option clobber
für Ihre Shell festlegen, wenn kein Schutz vor Dateikollisionen besteht.
Weitere Informationen: http://zsh.sourceforge.net/Doc/Release/Redirection.html
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.
$ 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
Der folgende Befehl sollte auch funktionieren:
cat /dev/null > file.log
Wenn Sie das Superuser-Recht für Sudo 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 hier http://www.commandlinefu.com/commands/view/12/empty-a-file
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.)
Einige Alternativen:
ex +%d -scwq file.log
cp /dev/null file.log
vi +%d -escwq file.log
install -m600 /dev/null file.log
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).
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.
Mit meinen Berechtigungen ist dies das einzige, was funktioniert hat:
touch temp.txt
Sudo mv temp.txt original-file.txt