2010-05-21 20 views
6

Je cherche à créer un travail cron qui ouvre un répertoire boucles à travers tous les journaux que j'ai créés et supprime toutes les lignes, mais gardez les 500 derniers par exemple.Bash modifier le fichier et garder les 500 dernières lignes

Je pensais à quelque chose le long des lignes de

tail -n 500 filename > filename

Est-ce que ce travail?

Je ne sais pas non plus comment parcourir un répertoire dans bash.

+0

Voir les autres réponses, mais votre exemple 'tail' ligne exécute comme ceci: 1) le shell ouvre le nom de fichier pour la sortie et le tronque à la longueur zéro 2) la queue s'exécute, voit un fichier vide et 3) n'écrit rien dans le nom de fichier maintenant vide. La réponse de MYYN montre comment vous éviter cela, mais même ces bombes si 'tail' rencontre une erreur. Ne réinventez pas le logrotate recommandé par tanascius. – msw

Répondre

5

Pensez à utiliser logrotate.
Il ne fera pas ce que vous voulez (supprimer toutes les lignes sauf les 500 dernières), mais il peut prendre soin des fichiers journaux qui sont plus gros qu'une certaine taille (normalement en comressant les anciens et en les supprimant à un moment donné). Devrait être largement disponible.

0

En bash, vous bouclez des fichiers dans un répertoire, par ex. comme ceci:

cd target/directory 

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

Le 'mv' devrait être conditionnel au succès de' tail'. –

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

'pour foo dans $ (find)' est une mauvaise habitude à développer. Soit utiliser 'trouver | tandis que lire ou globbing. Et le 'mv' devrait être conditionnel au succès de la' tail'. –

+0

@Dennis: merci - pouvez-vous expliquer pourquoi 'foo in $ (find ...)' est une mauvaise habitude? –

+0

S'il existe des noms de fichiers avec des espaces, il les verra en tant que plusieurs noms distincts. –

14

Si le fichier journal à tronquer est actuellement ouvert par certains services, l'utilisation de mv comme dans les réponses précédentes perturbera ces services. Cela peut être surmonté facilement en utilisant le chat à la place:

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

sauvé mon bacon ... deux fois! C'est presque comme un droit de passage à apprendre quand vous êtes confronté à un 'df -h' à 99% et 6 minutes avant une démo. – pjammer

3

À mon avis, la plus facile et la plus rapide utilise une variable:

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

pour ceux qui étaient pressés comme je l'étais, ce sont des accolades autour du nom de la variable ... –

Questions connexes