我正在寻找一个 cron 作业,它打开一个目录循环遍历我创建的所有日志并删除所有行,但例如保留最后 500 行。
我在想一些类似的东西
tail -n 500 filename > filename
这行得通吗?
我也不确定如何在 bash 中遍历目录。
如果要截断的日志文件当前已被某些服务打开,那么在前面的答案中使用 mv 将中断这些服务。这可以通过使用 cat 来轻松克服:
tail -n 1000 myfile.log > myfile.tmp
cat myfile.tmp > myfile.log
考虑使用logrotate。
它不会做你想做的事(删除除最后 500 行之外的所有行),但它可以处理大于一定大小的日志文件(通常通过压缩旧文件并在某个时候删除它们)。应该可以广泛使用。
在我看来,最简单和最快的方法是使用变量:
LASTDATA=$(tail -n 500 filename)
echo "${LASTDATA}" > filename
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
在 bash 中,您循环遍历目录中的文件,例如:
cd target/directory
for filename in *log; do
echo "Cutting file $filename"
tail -n 500 $filename > $filename.cut
mv $filename.cut $filename
done