shell 删除Bash中文件名的中间字符

l7wslrjt  于 2022-11-16  发布在  Shell
关注(0)|答案(1)|浏览(156)

我是bash中文本处理的新手,有数百个不同名称的文件:

TS_01_001_21.0.tif
TS_10_005_-21.0.tif
TS_21_010_-45.0.tif

我想删除中间部分和扩展名,使文件看起来像:

TS_01_21.0
TS_10_-21.0
TS_21_-45.0

到目前为止我已经:

for f in *.tif;do 
   mv "${f}" "${f%.tif}"
done

删除扩展名,但我想不出如何删除中间三个字符。任何帮助将不胜感激,谢谢!

bvpmtnay

bvpmtnay1#

假设条件:

  • middle始终表示3 digits加上下划线(_
  • 3 digits加上下划线(_)只出现一次(也称为middle
  • 扩展名始终为.tif

一个想法是使用一对参数替换来删除不需要的字符:

for f in TS_01_001_21.0.tif TS_10_005_-21.0.tif TS_21_010_-45.0.tif
do
    newf="${f//[0-9][0-9][0-9]_/}"
    newf="${newf/.tif/}"
    if [[ -f "${newf}" ]] 
    then
        # addressing comment/question re: what happens if two source files are modified to generate the same new file name
        echo "WARNING: ${newf} already exists. [ source: ${f} ]"
    else
        echo mv "${f}" "${newf}"
    fi
done

这会产生:

mv TS_01_001_21.0.tif TS_01_21.0
mv TS_10_005_-21.0.tif TS_10_-21.0
mv TS_21_010_-45.0.tif TS_21_-45.0

一旦对结果满意,OP可以删除echo,以便执行实际的文件重命名。

相关问题