在bash中从文件名列表动态提取各字符串独有模式的实现方法
Bash动态提取文件名独有差异段最优实现
核心逻辑是先计算所有输入文件名的最长公共前缀和最长公共后缀,每个文件名剔除前后公共部分后剩余的内容,就是需要提取的独有差异段,该方案不依赖固定命名模式,适配任意规则的同组文件名。
完整可复用脚本
extract_unique_parts() { # 输入参数:逗号分隔的文件名列表 local files=(${1//,/ }) local file_count=${#files[@]} (( file_count < 2 )) && { echo "${files[0]}"; return; } # 1. 计算最长公共前缀 local prefix=${files[0]} for f in "${files[@]}"; do while [[ "$f" != "$prefix"* ]]; do prefix=${prefix%?} done done local prefix_len=${#prefix} # 2. 计算最长公共后缀 local suffix=${files[0]} for f in "${files[@]}"; do while [[ "$f" != *"$suffix" ]]; do suffix=${suffix#?} done done local suffix_len=${#suffix} # 3. 提取每个文件的独有部分并拼接 local result=() for f in "${files[@]}"; do local trimmed=${f:$prefix_len} trimmed=${trimmed:0: ${#trimmed} - $suffix_len} result+=("$trimmed") done # 输出逗号分隔的结果 local IFS=, echo "${result[*]}" }
使用测试示例
- 测试示例1:
extract_unique_parts "Exp1_ML_Rep1.txt,Exp1_ML_Rep2.txt,Exp1_ML_Rep3.txt" # 输出:Rep1,Rep2,Rep3
- 测试示例2:
extract_unique_parts "Exp2_DT_10ng_55C_1_User1.png,Exp2_DT_10ng_55C_2_User1.png,Exp2_DT_10ng_55C_3_User1.png" # 输出:1,2,3
- 测试双字符串场景:
extract_unique_parts "ER_Rep1,ER_Rep2" # 输出:Rep1,Rep2
说明
- 原生bash实现,无需额外安装任何工具,兼容所有标准bash环境
- 自动适配任意命名规则的同组文件,不需要提前指定分隔符或匹配模式
内容的提问来源于stack exchange,提问作者UNagaswamy
相关产品推荐
相关产品推荐

