2010-05-21 45 views
6

我正在尋找創建一個cron作業,打開一個目錄,循環遍歷我創建的所有日誌,並刪除所有行,但保留最後500個例如。Bash編輯文件並保留最後500行

我正沿

tail -n 500 filename > filename

將這工作的思路思考的東西嗎?

我也不確定如何循環瀏覽bash中的一個目錄。

+0

看到其他的答案,但你的樣品'tail'行執行類似這個:1)shell打開文件名輸出並截斷爲零長度2)尾部運行,看到一個空文件,3)什麼都不寫入現在的空文件名。 MYYN的答案顯示了你如何避免這種情況,但即使是「尾巴」遇到錯誤也會發生這種炸彈。不要重複tanascius建議的logrotate。 – msw 2010-05-21 09:26:19

回答

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'的成功爲條件。 – 2010-05-21 12:24:57

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

'在$(find)中尋找foo'是一個不好的開發習慣。使用'find |同時閱讀「或globbing。而'mv'應該以'tail'的成功爲條件。 – 2010-05-21 12:24:20

+0

@丹尼斯:謝謝 - 你能解釋爲什麼在$(find ...)中尋找foo是壞習慣嗎? – 2010-05-21 16:47:41

+0

如果有空格的文件名,它會將它們看作多個單獨的名稱。 – 2010-05-21 17:27:27

14

如果要截斷的日誌文件當前由某些服務打開,那麼在之前的答案中使用mv會中斷這些服務。

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

救了我的培根兩次!這幾乎就像是在演示之前99%和6分鐘面對'df -h'時學習的權利。 – pjammer 2017-03-14 17:19:27

3

在我看來最簡單和最快的方法是使用一個變量:這可以通過使用貓,而不是輕易克服

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

對於那些像我一樣匆忙的人來說,那些圍繞變量名的花括號... – 2015-10-21 14:07:52