2009-02-05 63 views
0

我需要定期發送一個日誌文件的集合,這個日誌文件的集合可以增長得相當大,所以我只想發送每個文件的最後一行n將最後n行文件添加到tar/zip中

例如:

/usr/local/data_store1/file.txt (500 lines) 
/usr/local/data_store2/file.txt (800 lines) 

鑑於名爲files.txt所需的文件列表的文件,我想用最後100行,每行這些文件的創建存檔(tar或zip)。

我可以通過創建尾版文件在不同的目錄結構做到這一點,但是這似乎是一種資源的浪費時可能有一些神奇的管道,可以發生來完成它。完整的目錄結構也必須保留,因爲文件可以在不同的目錄中具有相同的名稱。

我希望解決方案是可能的shell腳本,但perl(無需添加模塊)也是可以接受的(這對於沒有安裝ruby/python/etc的Solairs機器)。

回答

1

你可以嘗試

tail -n 10 your_file.txt | while read line; do zip /tmp/a.zip $line; done 

其中a.zip是zip文件,10 n

tail -n 10 your_file.txt | xargs tar -czvf test.tar.gz -- 

包tar.gz

-1

爲什麼不把你的日誌文件放在SCM中?

您的接收器在他的機器上創建一個存儲庫,從他檢索文件的位置檢出文件。

您只需提交文件即可發送文件。只有diff會被傳送。

+0

這是極端的矯枉過正。 – hendry 2009-02-05 20:01:55

0

沒有管道魔術,你必須創建你想和壓縮的文件夾結構。

mkdir tmp 
for i in /usr/local/*/file.txt; do 
    mkdir -p "`dirname tmp/${i:1}`" 
    tail -n 100 "$i" > "tmp/${i:1}" 
done 
zip -r zipfile tmp/* 
0

使用logrotate

查看/etc/logrotate.d的例子。

1

您正在專注於特定的實現,而不是看大圖。

如果最終目標是在最小化傳輸數據量的同時在目標機器上準確複製文件,那麼應該使用的是rsync,它只會自動發送已更改文件的部分,接收時可以在發送和解壓縮時自動壓縮。

rsync的運行並不需要在目標機器的標準sshd的一個,並設置自動傳輸任何更多的守護進程沒有你只需要使用公共密鑰認證密碼。