2010-05-21 7 views
6

Estoy buscando crear un trabajo cron que abra un directorio en bucles a través de todos los registros que he creado y borre todas las líneas pero conserve las últimas 500 por ejemplo.Bash edite el archivo y guarde las últimas 500 líneas

Estaba pensando en algo en la línea de

tail -n 500 filename > filename

Que este trabajo?

Tampoco estoy seguro de cómo recorrer un directorio en bash.

+0

Ver las otras respuestas, pero su muestra 'Instituciones de tamaño pequeño línea ejecuta como esto: 1) el intérprete de comandos abre el nombre de archivo para la salida y lo trunca a longitud cero 2) ejecuta la cola, ve un archivo vacío y 3) no escribe nada en el nombre de archivo ahora vacío. La respuesta de MYYN muestra cómo evitar eso, pero incluso esas bombas si 'tail' encuentra un error. No reinvente logrotate que tanascius recomienda. – msw

Respuesta

5

pensar en usar logrotate.
No hará lo que quiera (borre todas las líneas excepto las últimas 500), pero puede encargarse de los archivos de registro que son más grandes que un determinado tamaño (normalmente al agregar los antiguos y eliminarlos en algún momento). Debería estar ampliamente disponible.

0

En bash, buclea los archivos en un directorio, p. de esta manera:

cd target/directory 

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

El 'mv' debe estar condicionado al éxito 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

'for foo in $ (find)' es un mal hábito para desarrollar. O use 'find | mientras lee' o globbing. Y el 'mv' debe estar condicionado al éxito de' tail'. –

+0

@Dennis: gracias - ¿puedes explicar por qué 'para foo in $ (find ...)' es un mal hábito? –

+0

Si hay nombres de archivo con espacios, los verá como nombres separados múltiples. –

14

Si algunos servicios abren actualmente el archivo de registro para truncar, usar mv como en respuestas anteriores interrumpirá esos servicios. Esto se puede superar fácilmente mediante el uso de gato en su lugar:

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

salvó mi tocino ... ¡dos veces! esto es casi como un derecho de paso para aprender cuando te enfrentas a un 'df -h' al 99% y 6 minutos antes de una demostración. – pjammer

3

En mi opinión la forma más fácil y rápida está utilizando una variable:

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

para los que tienen prisa como yo, esos son corchetes alrededor del nombre de la variable ... –

Cuestiones relacionadas