2010-05-21 6 views
6

Ich bin auf der Suche nach einem Cron-Job, der ein Verzeichnis öffnet Schleifen durch alle Protokolle, die ich erstellt habe und löscht alle Zeilen, aber behalten Sie die letzten 500 zum Beispiel.Bash Datei bearbeiten und die letzten 500 Zeilen behalten

Ich wurde nach dem Vorbild der

an etwas gedacht

tail -n 500 filename > filename

Würde das funktionieren?

Ich bin mir auch nicht sicher, wie man ein Verzeichnis in bash durchläuft.

+0

Die anderen Antworten, aber Ihre Probe 'tail' Linie führt wie this: 1) Die Shell öffnet den Dateinamen für die Ausgabe und schneidet sie auf Null Länge 2) Schwanz läuft, sieht eine leere Datei und 3) schreibt nichts in den jetzt leeren Dateinamen. Die Antwort von MYYN zeigt, wie man das vermeidet, aber selbst das bombardiert, wenn 'tail' auf einen Fehler trifft. Erfinden Sie das von tanascius empfohlene logrotate nicht neu. – msw

Antwort

5

über Think logrotate verwenden.
Es wird nicht tun, was Sie wollen (löschen Sie alle Zeilen, aber die letzten 500), aber es kann Logfiles kümmern, die größer als eine bestimmte Größe sind (normalerweise durch das Bekämpfen der alten und Löschen von ihnen irgendwann). Sollte allgemein verfügbar sein.

0

In bash Sie Schleife über Dateien in einem Verzeichnis, z. dies wie:

cd target/directory 

for filename in *log; do 
    echo "Cutting file $filename" 
    tail -n 500 $filename > $filename.cut 
    mv $filename.cut $filename 
done 
+0

Der 'mv' sollte vom Erfolg des' tail' abhängig gemacht werden. –

1
DIR=/path/to/my/dir # log directory 
TMP=/tmp/tmp.log # temporary file 
for f in `find ${DIR} -type f -depth 1 -name \*.log` ; do 
    tail -n 500 $f > /tmp/tmp.log 
    mv /tmp/tmp.log $f 
done 
+1

'für foo in $ (finden)' ist eine schlechte Angewohnheit zu entwickeln. Benutze 'find | beim Lesen oder Globbing. Und der "mv" sollte vom Erfolg des "Schwanzes" abhängig sein. –

+0

@Dennis: danke - kannst du erklären warum 'für foo in $ (find ...)' eine schlechte Angewohnheit ist? –

+0

Wenn es Dateinamen mit Leerzeichen gibt, werden diese als mehrere separate Namen angezeigt. –

14

Wenn die zu kündigende Protokolldatei derzeit von einigen Diensten geöffnet wird, stört die Verwendung von mv wie in vorherigen Antworten diese Dienste. Dies kann leicht durch die Verwendung Katze stattdessen überwunden werden:

tail -n 1000 myfile.log > myfile.tmp 
cat myfile.tmp > myfile.log 
+0

meinen Speck gerettet hat ... zweimal! Das ist fast wie ein Durchtrittsrecht, wenn man bei 99% und 6 Minuten vor einer Demo mit einem 'df -h' konfrontiert wird. – pjammer

3

Meiner Meinung nach ist die einfachste und schnellste Weg ist mit einer Variablen:

LASTDATA=$(tail -n 500 filename) 
echo "${LASTDATA}" > filename 
+0

für Eilige wie ich war, sind das geschweifte Klammern um den Variablennamen ... –

Verwandte Themen