You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写Bash脚本实现指定顺序的动态日志文件合并

批量合并编号日志文件的Bash脚本

需求说明

我的文件夹中有以下格式的日志文件:

messages
messages.1
messages.2
messages.3
messages.4
messages.5
messages.6
messages.7

需要按从最旧到最新的顺序合并成单个文件(比如log.txt),顺序为:
messages.7 → messages.6 → messages.5 → messages.4 → messages.3 → messages.2 → messages.1 → messages

之前手动执行的命令是:

cat messages.7 >> log.txt
cat messages.6 >> log.txt
cat messages.5 >> log.txt
cat messages.4 >> log.txt
cat messages.3 >> log.txt
cat messages.2 >> log.txt
cat messages.1 >> log.txt
cat messages >> log.txt

现在需要编写一个通用Bash脚本,处理任意数量符合该命名规则的文件(messages是最新日志,带最大编号的messages.N是最旧日志,无需反转文件内容)。

通用Bash脚本

#!/bin/bash

# 定义输出文件名
OUTPUT_FILE="log.txt"

# 清空已存在的输出文件(避免重复追加内容)
> "$OUTPUT_FILE"

# 获取所有带编号的messages文件,按编号从大到小排序
sorted_files=$(ls messages.* 2>/dev/null | awk -F. '{print $2, $0}' | sort -nr | awk '{print $2}')

# 先合并所有编号文件(从最旧到较新)
for file in $sorted_files; do
    cat "$file" >> "$OUTPUT_FILE"
done

# 最后合并最新的messages文件
cat messages >> "$OUTPUT_FILE"

echo "合并完成,结果已保存到$OUTPUT_FILE"

脚本说明

  • ls messages.* 2>/dev/null:列出所有带后缀的messages文件,2>/dev/null用于屏蔽“无匹配文件”的错误提示
  • awk -F. '{print $2, $0}':以.为分隔符,提取文件的编号和完整文件名
  • sort -nr:对编号进行逆序排序(从大到小),保证最旧的文件优先被合并
  • 循环遍历排序后的文件,依次追加到输出文件
  • 最后追加最新的messages文件,完成完整的合并流程

简化单行命令

如果不需要额外的提示信息,也可以用一行命令直接完成:

cat $(ls messages.* 2>/dev/null | awk -F. '{print $2, $0}' | sort -nr | awk '{print $2}') messages > log.txt

内容的提问来源于stack exchange,提问作者Nishil Shah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 15:48:16