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

Unix环境下遍历文件夹匹配文件名并重命名的正则表达式问题

批量处理.spart文件:提取物种名并生成带_sort后缀的文件

需求说明

需要遍历/home/directory/下的所有.spart文件,提取每个文件路径中最后一个/和.之间的物种名称,并将原文件内容保存到「原文件名追加_sort」的新文件中(或按需求生成以物种名命名的带_sort后缀的文件)。

待处理文件路径:

/home/directory/escherichia_coli.spart
/home/directory/pseudomonas_aeruginosa.spart
/home/directory/pseudomonas_fluorescens.spart
/home/directory/streptocuccus_agalactiae.spart

原脚本的问题

你之前的尝试存在几处语法错误:

  • 直接写$i > ...会把文件名当作命令执行,而非读取文件内容
  • $i/${i: /$.*\.}_sort.txt是无效路径拼接,$i已包含完整文件名,这样会生成类似/home/directory/xxx.spart/xxx的错误路径
  • ${i: /$.*\.}不是bash支持的参数展开语法,bash不支持这种内嵌正则的写法

正确解决方案

方法1:用bash内置参数展开(高效无需外部工具)

如果需求是原文件名后直接追加_sort.txt(比如escherichia_coli.spart → escherichia_coli.spart_sort.txt):

for file in /home/directory/*.spart; do
    # 生成新文件名:原路径+原文件名+_sort.txt
    new_file="${file}_sort.txt"
    # 复制原文件内容到新文件(如果是重命名原文件,把cp换成mv)
    cp "$file" "$new_file"
done

如果需求是提取物种名,生成物种名_sort.txt(比如escherichia_coli.spart → escherichia_coli_sort.txt):

for file in /home/directory/*.spart; do
    # 去掉路径前缀,只保留文件名(比如escherichia_coli.spart)
    filename="${file##*/}"
    # 去掉文件名后缀,提取物种名(比如escherichia_coli)
    species="${filename%.*}"
    # 生成新文件名
    new_file="/home/directory/${species}_sort.txt"
    cp "$file" "$new_file"
done

方法2:用正则表达式(sed工具)提取物种名

如果偏好正则匹配的方式,可以用sed提取最后一个/和.之间的内容:

for file in /home/directory/*.spart; do
    # 正则匹配提取物种名
    species=$(echo "$file" | sed -E 's/^.*\/(.*)\..*$/\1/')
    # 按需求生成新文件名,示例为物种名+_sort.txt
    new_file="/home/directory/${species}_sort.txt"
    cp "$file" "$new_file"
done

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 10:55:16