[英]How to log the compressed zip files when using a function in shell script
[英]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.