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
相关产品推荐
相关产品推荐

