使用shell脚本操作文件名:更改文件扩展名

Gop*_*ant 2 shell

我需要编写一个shell脚本来将图像格式从.png转换为.tif.脚本如下:

#!/bin/sh

for f in `ls *.png`
do
    convert $f $f.tif
done
Run Code Online (Sandbox Code Playgroud)

但这样做会将.tif格式附加到现有文件名.即如果图像是abc.png,$ f将具有abc.png,并且在转换文件名后变为abc.png.tif.这不是我想要的.我需要它是abc.tif.如何操作$ f来删除.png?

sam*_*hen 6

这应该适合你:

#!/bin/bash

for file in *.png
do
    filename=$(basename "$file")
    filename=${filename%.*}
    convert $file $filename.tif
done
Run Code Online (Sandbox Code Playgroud)

这是如何工作的逐行演练:

  • for file in *.png- 您不需要命令替换ls *.png来获取具有png扩展名的文件列表.通配符*将在shell中自动扩展以匹配cwd中的文件列表; 在这种情况下,结尾的文件列表.png.
  • filename=$(basename "$file") - 这只适用于防御性编程; 它获取文件的实际名称
  • filename=${filename%.*} - 这将删除扩展名 filename
  • convert $file $filename.tif - 运行您的实际转换命令

  • 但是,如果他这样做,它不应该将结果放在包含正在转换的文件的子目录中,而不是当前目录吗?另外,如果您使用`basename`,为什么不使用它的第二个参数来删除`.png`后缀? (2认同)