首页 > 解决方案 > 用于将日志文件复制到单个压缩文件中的 shell 脚本

问题描述

我们的嵌入式板“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。

你能帮我优化脚本吗

谢谢你的时间

标签: linuxshellash

解决方案


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

如果你的 shell 不支持这种调用格式,你可以试试这个

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

推荐阅读