2010-03-11 5 views
100

Ich habe eine Datei namens error.log auf meinem Server, die ich häufig abschneiden muss. Ich habe rw Berechtigungen für die Datei. Öffnen der Datei in vi> Löschen aller Inhalte> Speichern funktioniert (natürlich). Aber wenn ich versuche, die unterWie kann ich eine Datei auf Linux, die bereits existiert und geschützt ist, leeren ("trunkieren")?

cat /dev/null > error.log 

bekomme ich die Meldung

File already exists. 

Offensichtlich gibt eine Art von Konfiguration auf dem Server erfolgt ist zufällig überwiegende von Dateien zu verhindern. Kann jemand sagen, wie ich die Datei in einem einzigen Befehl "abschneide"?

+2

Für eine nicht geschützte Datei funktioniert die Datei truncate -s 0. – Pramod

Antwort

147

Sie haben die noclobber Option festgelegt. Der Fehler sieht aus wie es von csh ist, so würden Sie tun:

cat /dev/null >! file 

Wenn ich falsch bin, und Sie verwenden bash, sollten Sie tun:

cat /dev/null >| file 

in bash, können Sie auch, dass verkürzen zu:

>| file 
+0

Sie haben Recht, dass die Shell csh ist. Wie hast du das gewusst? –

+5

@Wikidkaka - basierend auf der Fehlermeldung. csh auf meinem System gibt den gleichen 'Datei existiert' Fehler, während bash den sehr unterschiedlichen' can not exibite existing file' Fehler gibt. –

+6

@Jarmund - da der Benutzer noclobber gesetzt hat, funktioniert '> file' nicht. –

4

falsch | tee fileToTruncate

können auch

+0

verwenden Das ist nur dumm. Oder, wenn das nützlich ist, wäre das "dd", nichts auszugeben, sogar besser als das einfach lesbare "false"? – tripleee

47

Diese Arbeit wird ausreichen, um die Dateigröße auf 0 zu setzen:

> error.log 
+6

'sudo sh -c '> error.log'' –

+4

tatsächlich funktioniert dieses ** nicht ** mit noclobber (hat es selbst getestet), also ist es in diesem Fall KEINE gültige Lösung (" -bash: error.log : kann vorhandene Datei nicht überschreiben "); siehe oben ("@Jarmund - da der Benutzer noclobber gesetzt hat,> Datei funktioniert nicht."). Ich frage mich nur, welche Art von "intelligenten Menschen" offensichtlich falsche Antworten wie diese auffrischt ... – vaxquis

-3

Sie versuchen, auch können:

echo -n > /my/file

+8

Sehen Sie die Antwort mit einer Menge Stimmen? Versuchen Sie, es zu lesen, und schauen Sie 'noclobber' auf und fragen Sie sich dann, ob Ihre Antwort überhaupt einen Sinn ergibt. –

63

Sie auch Funktion truncate verwenden können

$truncate -s0 yourfile 

wenn die Erlaubnis, sudo Verwendung

verweigert
$sudo truncate -s0 yourfile 

Hilfe/Handbuch: Mann gestutzt

auf Ubuntu Linux getestet

+1

truncate berührt auch die Änderungszeit der Datei - während "> file" nicht berührt, wenn die Datei unverändert ist. – dsteinkopf

2

Da sudo nicht mit redirection> arbeiten, Ich mag den tee Befehl für Dieser Zweck

echo "" | sudo tee fileName 
+0

Nun, eigentlich tut es, wie in der Frage, die Sie verlinkt und hier oben beschrieben. "sudo sh -c '> error.log'" ... – vaxquis

+0

hängt von den Berechtigungen für die Zieldatei 'error.log' ab, wenn diese bereits beschreibbar ist, muss nicht sudo ausgeführt werden. Ich denke, das andere Problem ist, dass Sie Befehl übergeben als String-Argument zu 'sh', ich weiß nicht, wie das intern behandelt wird, aber das ist eine andere Schicht der Komplexität/Umleitung hinzugefügt – sakhunzai

+0

Dies wird nicht wirklich die Datei abgeschnitten, weil' echo "" 'fügt einen Zeilenumbruch hinzu. Sie können 'echo -n" "' verwenden, um den Zeilenumbruch zu unterdrücken. – Seb

6

der Kredit geht für meine älteren Kollegen dafür:

:> filename 

Dies bricht nicht-Log-Dateien, so können Sie es sogar auf syslog verwenden, zum Beispiel.

+8

Bitte erläutern. Wie funktioniert es? Was macht diese Notation? – user31986

+2

@ user31986 ':' ist ein No-Effekt-Befehl (fast ein Kommentar), dann '>' ist Umleitung wie üblich, so leitet dies nur die fehlende Ausgabe von einem Befehl um, der nichts in die Datei tut. Wenn Noclobber aktiviert ist, benötigen Sie ':> | Dateiname' (bash) (und ich nehme an ':>! filename' in csh, vorausgesetzt csh hat': '). – Rhubbarb

Verwandte Themen