在 linux shell 命令中替换输出文件扩展名

Replace output file extension in linux shell command

假设我有一个命令 convertImage,它接受一些输入 jpeg,并在同一目录中生成一个新的 png:

convertImage --format png photo.jpg -o photo.png

我想创建一个别名 "convertToPng",它只需要一个参数,文件:

convertToPng photo.jpg

我目前的解决方案是这样的:

alias convertToPng "convertImage --format png \!:1 -o \!:1.png"

然而,这会将输出文件命名为 "photo.jpg.png",我希望它被命名为 "photo.png"。有没有办法先解析文件名,然后将其传递给 convertImage 可执行文件?

如果您的输入始终是 jpg 那么

convertToPng photo
alias convertToPng "convertImage --format png \!:1.jpg -o \!:1.png"

或将扩展名作为第二个参数

convertToPng photo jpg
alias convertToPng "convertImage --format png \!:1.\!:2 -o \!:1.png"

或最后一个选项

convertToPng photo.jpg
alias convertToPng "convertImage --format png \!:1 -o `echo  | cut -f1 -d'.'`.png"

或者在你的.bashrc中写一个函数如下

function convert() 
{
    convertImage --format png  -o `echo  | cut -f1 -d'.'`.png;
}

并在 function 上面执行为

convert photo.jpg

我更喜欢 function 方式,因为它比 aliases 给你更多的灵活性,而且你可以做的不仅仅是一个声明。

echo photo.jpg | awk -F. '{print ".png"}'

这可以像这样在命令行调用中使用:

$ convertImage --format png photo.jpg -o `echo photo.jpg | awk -F. '{print ".png"}'`