从bash中的输入文件生成输出文件名

5

我有一个Bash脚本:

#!/bin/bash
convert "$1" -resize 50% "$2"

在运行脚本时,我希望只提供源文件(或输入文件名),而输出文件名应该从源文件名自动生成。类似于这样的代码"$1" | cut -d'.' -f1".jpg"。如果输入文件名是myimage.png,则输出名称应为myimage.jpg。应将.jpg附加到源文件名的第一部分。如果参数是*.png,它也应该起作用。那么我该如何修改我的脚本?


这个命令行可以工作吗:convert "*.png" -resize 50% "*.jpg"?我怀疑在这种情况下你需要一个循环。 - glenn jackman
3个回答

5

${X%pattern} 的扩展会删除 $X 结尾的 pattern

convert "$1" -resize 50% "${1%.*}.jpg"

要在多个文件上工作:

for filename ; do
    convert "$filename" -resize 50% "${filename%.*}.jpg"
done

这将遍历每个命令行参数,并是 for filename in "$@" 的简写。您无需担心检查参数是否为 *.png - shell 将为您展开它 - 您只需接收扩展的文件名列表。


2
convert "$1" -resize 50% "${1%.*}.jpg"

魔法在于%.*部分,它会删除最后一个点之后的所有内容。如果您的文件没有扩展名,它仍然可以工作(只要路径中没有其他点)。

0
OUTFILE=`echo $1|sed 's/\(.*\)\..*/\1/'`.jpg
convert "$1" -resize 50% "$OUTFILE"

1
请考虑使用 $() 而不是反引号。 - SiegeX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接