如何从Linux命令行的变量中提取没有扩展名(并添加计数器)的文件名?

时间:2016-10-26 02:28:31

标签: linux unix command-line

我想在Linux(Mint 17)命令行的文件夹中进行批量转换和调整某些图像的大小,所以我正在使用:

for $file in *.jpg; do convert -resize 25% $file $file.png; done

但这给我留下了一堆文件,如:

image1.jpg.png
photo4.jpg.png
picture7.jpg.png
...

有没有一种方法可以轻松地从文件名中剪切文件扩展名,以便它只有.png而不是前面的.jpg

或者,更好的是,我可以包含一个计数器,以便我可以运行这样的命令:

for $file in *.jpg using $count; do convert -resize 25% $file image$count.png; done

所以我最终得到了类似的东西:

image1.png
image2.png
image3.png
image4.png
...

我宁愿不必担心创建批处理脚本,所以如果这太难了并且有一种简单的方法可以只删除.jpg内联,那么我很满意该..

谢谢!

修改
我认为这个问题可以成为一个问题,因为它也有一个反制元素。

4 个答案:

答案 0 :(得分:2)

 for file in *.jpg; do convert -resize 25% $file ${file%.*}.png; done 

答案 1 :(得分:1)

这样的东西?

i=image1.jpg
echo ${i/.jpg/.png}
image1.png

答案 2 :(得分:1)

$ ls *.jpg
DSCa_.jpg*  DSCb_.jpg*  DSCc_.jpg*
$ count=0; for file in *.jpg; do (( count++ )); convert -resize 25% "$file" "${file%\.*}$count.png"; done
$ ls *.png
DSCa_1.png  DSCb_2.png  DSCc_3.png

${file%\.*}使用参数替换从$file右侧删除最短匹配字符串。您可以阅读有关参数替换here

的更多信息

答案 3 :(得分:1)

此外,您可以使用命令 basename (从文件名中删除后缀):

for file in *.jpg; do base=$( basename  ${file} .jpg); convert -resize 25% $file ${base}.png; done