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,解释器是灰的
你能帮我优化脚本吗
感谢您的宝贵时间
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
您有语法错误。是 -f
,而不是 - f
。示例:
if [ -f statuslogs/daily_status_2017*.log ]; then
gzip -c statuslogs/daily_status_2017*.log > status_2017.gz
fi
但是,如果您有多个匹配文件,您可能会 运行 出现 "too many arguments" 错误。这样效果会更好:
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
我们的嵌入式板中有一个文件夹 "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,解释器是灰的
你能帮我优化脚本吗
感谢您的宝贵时间
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
您有语法错误。是 -f
,而不是 - f
。示例:
if [ -f statuslogs/daily_status_2017*.log ]; then
gzip -c statuslogs/daily_status_2017*.log > status_2017.gz
fi
但是,如果您有多个匹配文件,您可能会 运行 出现 "too many arguments" 错误。这样效果会更好:
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