6

我正在寻找一个 cron 作业,它打开一个目录循环遍历我创建的所有日志并删除所有行,但例如保留最后 500 行。

我在想一些类似的东西

tail -n 500 filename > filename

这行得通吗?

我也不确定如何在 bash 中遍历目录。

4

5 回答 5

14

如果要截断的日志文件当前已被某些服务打开,那么在前面的答案中使用 mv 将中断这些服务。这可以通过使用 cat 来轻松克服:

tail -n 1000 myfile.log > myfile.tmp
cat myfile.tmp > myfile.log
于 2013-07-05T13:44:56.750 回答
5

考虑使用logrotate
它不会做你想做的事(删除除最后 500 行之外的所有行),但它可以处理大于一定大小的日志文件(通常通过压缩旧文件并在某个时候删除它们)。应该可以广泛使用。

于 2010-05-21T09:17:47.147 回答
3

在我看来,最简单和最快的方法是使用变量:

LASTDATA=$(tail -n 500 filename)
echo "${LASTDATA}" > filename
于 2014-09-21T10:45:59.070 回答
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
于 2010-05-21T09:16:01.470 回答
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
于 2010-05-21T09:15:24.047 回答