我正在尋找創建一個cron作業,打開一個目錄,循環遍歷我創建的所有日誌,並刪除所有行,但保留最後500個例如。Bash編輯文件並保留最後500行
我正沿
tail -n 500 filename > filename
將這工作的思路思考的東西嗎?
我也不確定如何循環瀏覽bash中的一個目錄。
我正在尋找創建一個cron作業,打開一個目錄,循環遍歷我創建的所有日誌,並刪除所有行,但保留最後500個例如。Bash編輯文件並保留最後500行
我正沿
tail -n 500 filename > filename
將這工作的思路思考的東西嗎?
我也不確定如何循環瀏覽bash中的一個目錄。
考慮使用logrotate。
它不會做你想做的事(刪除所有行,但是最後的500行),但它可以處理大於特定大小的日誌文件(通常通過壓縮舊的文件並在某些時候刪除它們)。應該廣泛提供。
在bash中,您可以遍歷目錄中的文件,例如,像這樣:
cd target/directory
for filename in *log; do
echo "Cutting file $filename"
tail -n 500 $filename > $filename.cut
mv $filename.cut $filename
done
'mv'應該以'tail'的成功爲條件。 – 2010-05-21 12:24:57
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
'在$(find)中尋找foo'是一個不好的開發習慣。使用'find |同時閱讀「或globbing。而'mv'應該以'tail'的成功爲條件。 – 2010-05-21 12:24:20
@丹尼斯:謝謝 - 你能解釋爲什麼在$(find ...)中尋找foo是壞習慣嗎? – 2010-05-21 16:47:41
如果有空格的文件名,它會將它們看作多個單獨的名稱。 – 2010-05-21 17:27:27
如果要截斷的日誌文件當前由某些服務打開,那麼在之前的答案中使用mv會中斷這些服務。
tail -n 1000 myfile.log > myfile.tmp
cat myfile.tmp > myfile.log
救了我的培根兩次!這幾乎就像是在演示之前99%和6分鐘面對'df -h'時學習的權利。 – pjammer 2017-03-14 17:19:27
在我看來最簡單和最快的方法是使用一個變量:這可以通過使用貓,而不是輕易克服
LASTDATA=$(tail -n 500 filename)
echo "${LASTDATA}" > filename
對於那些像我一樣匆忙的人來說,那些圍繞變量名的花括號... – 2015-10-21 14:07:52
看到其他的答案,但你的樣品'tail'行執行類似這個:1)shell打開文件名輸出並截斷爲零長度2)尾部運行,看到一個空文件,3)什麼都不寫入現在的空文件名。 MYYN的答案顯示了你如何避免這種情況,但即使是「尾巴」遇到錯誤也會發生這種炸彈。不要重複tanascius建議的logrotate。 – msw 2010-05-21 09:26:19