2010-05-21 1 views
6

Я ищу, чтобы создать задание cron, которое открывает каталог, перебирает все журналы, которые я создал и удаляет все строки, но сохраняю последние 500, например.Bash отредактируйте файл и сохраните последние 500 строк

Я думал о чем-то вдоль линий

tail -n 500 filename > filename

Будет ли это работать?

Я также не уверен, как пройти через каталог в bash.

+0

Смотрите другие ответы, но ваш образец 'tail' линия выполняет как это: 1) оболочка открывает имя файла для вывода и обрезает его до нулевой длины; 2) выполняет хвост, видит пустой файл и 3) ничего не записывает в пустые имена файлов. Ответ MYYN показывает, как вы избегаете этого, но даже те бомбы, если «хвост» встречает ошибку. Не изобретайте логротат, который рекомендует tanascius. – msw

ответ

5

Подумайте об использовании logrotate.
Он не будет делать то, что вы хотите (удалите все строки, кроме последних 500), но он может позаботиться о лог-файлах, размер которых превышает определенный размер (обычно, пошагая старые и удаляя их в какой-то момент). Должно быть широко доступно.

0

В bash вы перебираете файлы в каталоге, например. как это:

cd target/directory 

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

'mv' должен быть обусловлен успехом' 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)' - плохая привычка развиваться. Либо используйте 'find | в то время как read' или globbing. И 'mv' должен быть обусловлен успехом« хвоста ». –

+0

@ Dennis: thanks - можете ли вы объяснить, почему 'for foo in $ (find ...)' является плохой привычкой? –

+0

Если есть имена файлов с пробелами, они будут видеть их как несколько отдельных имен. –

14

Если файл журнала, подлежащий усечению, в настоящее время открыт некоторыми службами, то использование mv, как в предыдущих ответах, приведет к нарушению этих служб. Это можно легко преодолеть с помощью кошки вместо:

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

спас мой бекон ... дважды! это почти похоже на право прохождения, чтобы узнать, когда вы сталкиваетесь с 'df -h' на 99% и 6 минут перед демонстрацией. – pjammer

3

На мой взгляд, самый простой и быстрый способ использует переменную:

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

для тех, кто спешит, как и я, это фигурные скобки вокруг имени переменной ... –

Смежные вопросы