簡體   English   中英

用於將日志文件復制到單個壓縮文件中的shell腳本

[英]shell script for copying log files into a single compressed file

我們的嵌入式開發板中有一個“ statuslogs”文件夾,該文件夾包含日志,其格式為:daily_status_date_time.log。

我們需要將特定年份的所有文件放入一個文件中,以便從服務器獲取。

我們在腳本中執行了以下操作

gzip -c statuslogs/daily_status_2017*.log > status_2017.gz
gzip -c statuslogs/daily_status_2018*.log > status_2018.gz
gzip -c statuslogs/daily_status_2019*.log > status_2019.gz
gzip -c statuslogs/daily_status_2020*.log > status_2020.gz
gzip -c statuslogs/daily_status_2021*.log > status_2021.gz

此邏輯的問題在於,它仍將在2019,2020,2021年創建status _ *。gz文件。

我嘗試編寫以下邏輯

if [ - f statuslogs/daily_status_2017*.log ]但由於正則表達式而失敗。 我不使用bash,解釋器是ash。

您能幫我優化腳本嗎

謝謝你的時間

Gzip僅適用於單個文件。 如果需要單獨的文件,則需要執行以下操作之一:

使用tar合並文件:

tar cf status_2017.tar.gz statuslogs/daily_status_2017*.log

或使用zip直接支持多個文件

zip status_2017.zip statuslogs/daily_status_2017*.log

現在,如果問題僅在於您每年需要一個存檔,而僅是文件存在的年份,則可以使用for循環處理所有年份:

for year in `ls statuslogs/daily_status_* | cut -d _ -f 3 | sort | uniq`; do 
    tar cf status_$year.tar.gz statuslogs/daily_status_$year*.log; 
done

如果您的外殼不支持該調用格式,則可以嘗試使用

ls statuslogs/daily_status_* | cut -d _ -f 3 | sort | uniq > years
cat years | while read year; do
    tar cf status_$year.tar.gz statuslogs/daily_status_$year*.log; 
done

如果您只想為所有日志使用一個文件,則可以完全忽略年份部分

tar cf statuslogs.tar.gz statuslogs/daily_status*.log

您有語法錯誤。 這是-f ,不是- f 例:

if [ -f statuslogs/daily_status_2017*.log ]; then
    gzip -c statuslogs/daily_status_2017*.log > status_2017.gz
fi

但是,這樣做可能會遇到“參數過多”錯誤,如果您有多個匹配文件,則會發生此錯誤。 因此,這樣做會更好:

if find statuslogs/daily_status_2017*.log -mindepth 0 -maxdepth 0|head -n1; then 
    gzip -c statuslogs/daily_status_2017*.log > status_2017.gz
fi

當您達到當前年份時,最好停止循環。 例如,

for year in $(seq 2017 $(date +%Y)); do

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM