Leeren Sie den Inhalt einer Datei

220

Ich kenne drei Methoden, um alle Einträge aus einer Datei zu löschen.

Sie sind

  • >filename
  • touch filename
  • filename < /dev/null

Von diesen dreien missbrauche ich >filenameam meisten, da dies die geringste Anzahl von Tastenanschlägen erfordert.

Ich möchte jedoch wissen, welche der drei Methoden (sofern es effizientere Methoden gibt) in Bezug auf große Protokolldateien und kleine Dateien am effizientesten ist.

Wie funktionieren die drei Codes und wie löschen sie den Inhalt?

debal
quelle
24
Was ist truncate -s 0 filename?
Martin Thoma
Sehr ähnlich zu Unterschied zwischen Katze und '>', um eine Datei auf Null zu setzen, in der Sie weitere Informationen finden.
Stéphane Chazelas
Der erste Befehl funktioniert nur, wenn er über die Bash-Befehlszeile aufgerufen wird, aber nicht, wenn er in einer .sh-Datei ausgeführt wird
Marco Marsala,
8
touch löscht keine Inhalte, ändert jedoch die Zugriffszeit auf die Datei. Es tut erstellen eine leere Datei , wenn es keine gab.
HBOGERT

Antworten:

293

Tatsächlich touch filenamelöscht das zweite Formular nichts aus der Datei - es erstellt nur eine leere Datei, wenn keine vorhanden ist, oder aktualisiert das Datum der letzten Änderung einer vorhandenen Datei.

Und der dritte filename < /dev/nullversucht, Dateinamen /dev/nullals Eingabe auszuführen .

cp /dev/null filename funktioniert.

Was die Effizienz betrifft, wäre die Effizienz am größten truncate -s 0 filename. siehe hier: http://linux.die.net/man/1/truncate .

Ansonsten cp /dev/null filenameoder > filenamebeides in Ordnung. Beide öffnen und schließen die Datei mit der Einstellung "Beim Öffnen abschneiden". cpöffnet auch /dev/null, so dass es geringfügig langsamer macht.

Auf der anderen Seite truncatewäre dies wahrscheinlich langsamer als > filenamebeim Ausführen eines Skripts, da das System zum Ausführen des Befehls truncate das ausführbare Programm öffnen, laden und ausführen muss.

Asche
quelle
9
Warum ist das Ihrer Meinung nach truncateam effizientesten?
Stéphane Chazelas
7
Die Kürzungsoperation verwendet den Systemaufruf ftruncate () oder truncate (), der das Öffnen der Datei nicht stört. Außerdem wird der Systemaufruf close () vermieden, den cp und die > filenameMethoden aufrufen müssen.
Asche
3
Tatsächlich macht es (zumindest das GNU) ein open + ftruncate + close (zusätzlich zu den vielen Systemaufrufen, die es macht, um sich selbst zu laden und zu initialisieren), als müsste es die Datei sowieso erstellen, wenn es sie nicht gäbe und truncate(2)tut das nicht.
Stéphane Chazelas
Wenn wir verwenden touch filename, bleibt der Inode derselbe (vorausgesetzt, es gab vorher eine Datei)?
pMan
1
@pMan ja, du kannst es versuchen und ls -i
nachfragen
43

Eine andere Option könnte sein:

echo -n > filename

Aus der Manpage von echo:

-n Do not print the trailing newline character.

Arturo Herrero
quelle
Wie kann ich die Größe einstellen? Sagen Sie, wenn ich 30000 Nullzeichen haben möchte?
User
3

Es gibt einen eingebauten Befehl ":", der unter Umständen in sh, csh, bash und anderen verfügbar ist und mit dem Umleitungs-Ausgabeoperator zum >Abschneiden einer Datei verwendet werden kann:

#!/usr/bin/env bash
:> filename

Was ich daran mag ist, dass es keine externen Befehle wie "Echo" etc. benötigt.

Ein großer Vorteil des Abschneidens von Dateien, anstatt sie zu löschen / neu zu erstellen, ist, dass das Ausführen von Anwendungen, die mit dieser Datei funktionieren (z. B. jemand erstellt eine tail -f filenameoder eine Überwachungssoftware, ...), diese nicht erneut öffnen muss. Sie können den Filedescriptor einfach weiterverwenden und erhalten alle neuen Daten.

Mirko Steiner
quelle
man bashbeschreibt die :eingebaute Shell als wirkungslos.
Haxiel
Ja, und Sie leiten dies mit >in in die Datei um, die die Datei erstellt, wenn sie nicht vorhanden ist, und wenn sie vorhanden ist, kürzen Sie sie auf Null. Besser gesagt: Sie verwenden das :, um nichts zu tun, und verwenden >, um nichts in eine Datei umzuleiten und diese zu kürzen.
Mirko Steiner
1
Warum würdest du das tun? > filereicht aus, um eine Datei abzuschneiden. Sie benötigen keinen Befehl, nur den Umleitungsoperator.
terdon
1
manchmal > filenamefunktioniert nicht. Zum Beispiel in zsh. : > filenamefunktioniert aber trotzdem.
CS Pei
Bash und sh scheinen > myfileaber zB csh-Fehler mit zu mögen : Ungültiger Null-Befehl.
Mirko Steiner