Wie kann man eine Datei unter Linux leeren ("abschneiden"), die bereits existiert und irgendwie geschützt ist?

113

Ich habe eine Datei namens error.log auf meinem Server, die ich häufig abschneiden muss. Ich habe rw-Berechtigungen für die Datei. Das Öffnen der Datei in vi> Löschen aller Inhalte> Speichern funktioniert (offensichtlich). Aber wenn ich das unten versuche

cat /dev/null > error.log

Ich verstehe die Nachricht

File already exists.

Offensichtlich wird auf dem Server eine Konfiguration vorgenommen, um ein versehentliches Überschreiben von Dateien zu verhindern. Kann jemand sagen, wie ich die Datei in einem einzigen Befehl "abschneiden" kann?

Sumeet Pareek
quelle
2
Bei einer nicht geschützten Datei funktioniert das Abschneiden der Datei -s 0.
Pramod

Antworten:

158

Sie haben die noclobberOption festgelegt. Der Fehler scheint von csh zu stammen, also würden Sie Folgendes tun:

cat /dev/null >! file

Wenn ich falsch liege und Sie Bash verwenden, sollten Sie Folgendes tun:

cat /dev/null >| file

In Bash können Sie das auch verkürzen auf:

>| file
R Samuel Klatchko
quelle
Sie haben Recht damit, dass die Shell csh ist. Wie hast du das gewusst?
Sumeet Pareek
6
@ Wikidkaka - basierend auf der Fehlermeldung. csh auf meinem System gibt den ähnlichen File existsFehler aus, während bash den sehr unterschiedlichen cannot overwrite existing fileFehler ausgibt.
R Samuel Klatchko
6
@Jarmund - da der Benutzer noclobber gesetzt hat, >filefunktioniert nicht.
R Samuel Klatchko
Was ist der Unterschied zwischen > fileund >| file?
Will
1
@Will - Wenn Sie die noclobberOption festgelegt haben, schlägt der Versuch, zu einer vorhandenen Datei umzuleiten, fehl. Um die spezifische Umleitung zu überschreiben, während noclobber eingeschaltet bleibt, können Sie>|
R Samuel Klatchko
71

Sie können auch die Funktion Abschneiden verwenden

$truncate -s0 yourfile

Wenn die Erlaubnis verweigert wird, verwenden Sie sudo

$sudo truncate -s0 yourfile

Hilfe / Handbuch: Mann abschneiden

getestet auf Ubuntu Linux

Risnandar
quelle
1
Abschneiden berührt auch die Änderungszeit der Datei - während "> Datei" nicht berührt wird, wenn die Datei unverändert ist.
Dsteinkopf
Der in der Datei enthaltene Speicherplatz wird nicht freigegeben. Zuerst werden die 0 Bytes angezeigt. Wenn Sie jedoch etwas in diese Datei schreiben, lautet die Dateigröße = vor dem Abschneiden + neue Datengröße.
Aniket Kulkarni
48

Dies reicht aus, um die Dateigröße auf 0 zu setzen:

> error.log
SIFE
quelle
6
Tatsächlich funktioniert dies nicht mit noclobber (habe es selbst getestet), daher ist es in diesem Fall KEINE gültige Lösung ("-bash: error.log: vorhandene Datei kann nicht überschrieben werden"); siehe Empfehlung oben ("@Jarmund - da der Benutzer noclobber gesetzt hat, funktioniert> Datei nicht."). Ich frage mich nur, welche Art von "intelligenten Menschen" offensichtlich falsche Antworten wie diese
9

Der Kredit geht an meinen älteren Kollegen dafür:

:> filename

Dadurch werden Protokolldateien nicht beschädigt, sodass Sie sie beispielsweise sogar für Syslog verwenden können.

petermolnar
quelle
8
Bitte erkläre. Wie funktioniert es? Was macht diese Notation?
user31986
2
@ user31986 :ist ein No-Effect-Befehl (fast ein Kommentar) und wird dann >wie gewohnt umgeleitet. Dadurch wird nur die fehlende Ausgabe eines Befehls umgeleitet, der nichts in die Datei einfügt. Wenn noclobber aktiviert ist, benötigen Sie :>| filename(bash) (und ich nehme :>! filenamein csh an, vorausgesetzt, csh hat :).
Rhubbarb
4

false | tee fileToTruncate

kann auch funktionieren

Dodger Web
quelle
Das ist einfach albern. Oder wenn dies nützlich ist, ddwäre es sogar noch besser, nichts auszugeben, als einfach lesbar zu sein false?
Tripleee
2

Da sudo nicht mit Umleitung funktioniert >, gefällt mir der teeBefehl zu diesem Zweck

echo "" | sudo tee fileName
sakhunzai
quelle
Nun, tatsächlich, wie in der Frage, die Sie verlinkt haben, und hier oben beschrieben. "sudo sh -c '> error.log'" ...
Dies hängt von den Berechtigungen für die Zieldatei ab error.log. Wenn diese bereits beschreibbar sind, muss kein Sudo ausgeführt werden. Ich denke, das andere Problem ist, dass Sie den Befehl als Zeichenfolgenargument übergeben sh. Ich weiß nicht, wie das intern behandelt wird, aber das ist eine weitere Ebene der Komplexität / Umleitung, die hinzugefügt wurde
sakhunzai
1
Dadurch wird die Datei nicht wirklich abgeschnitten, da echo ""eine neue Zeile hinzugefügt wird. Sie können verwenden echo -n "", um die Newline zu unterdrücken
Seb
0

Jeder kann diesen Befehl versuchen, um jede Datei im Linux-System abzuschneiden

Dies wird sicherlich in jedem Format funktionieren:

truncate -s 0 file.txt
user3301460
quelle
0

Ich mag das: cp /dev/null file

Den129
quelle
-4

Sie können auch versuchen:

echo -n > /my/file

Oden
quelle
8
Sehen Sie die Antwort mit einer Menge Stimmen? Versuchen Sie es zu lesen, schauen Sie nach noclobberund fragen Sie sich dann, ob Ihre Antwort überhaupt Sinn macht.