开发者

File name without extension in bash for loop

In a for loop like this one:

for f in `ls *.avi`; do echo $f; ffmpeg -i $f $f.mp3; done

$f will be the complete filename, including the extension. For example, for song1.avi the output of the command will be song1.avi.mp3. Is there a way to get only song1, without the .avi from the for开发者_开发知识库 loop?

I imagine there are ways to do that using awk or other such tools, but I'm hoping there's something more straight forward.

Thanks


Use bash parameter expansion

${f%%.*}

Note that you need the greedy version because there are multiple dots in the file name.

From bash manual:

${parameter%word}

${parameter%%word}

The word is expanded to produce a pattern just as in filename expansion. If the pattern matches a trailing portion of the expanded value of parameter, then the result of the expansion is the value of parameter with the shortest matching pattern (the ‘%’ case) or the longest matching pattern (the ‘%%’ case) deleted. If parameter is ‘@’ or ‘’, the pattern removal operation is applied to each positional parameter in turn, and the expansion is the resultant list. If parameter is an array variable subscripted with ‘@’ or ‘’, the pattern removal operation is applied to each member of the array in turn, and the expansion is the resultant list.


This should do it:

for i in *.m4a; do
  ffmpeg -i $i ${i%%.*}.mp3
done


I combined the code sample from https://stackoverflow.com/a/8077421/340175 (which applies the answer in https://stackoverflow.com/a/7119316/340175) and Charles Duffy's comment (which I can't find a way to link to directly) to get:

for i in *.png; do img2pdf "$i" --out "${i%.*}.pdf";done

And yes, I do have lots of filenames with spaces in them, the quotation marks enabled the command to process those files too. I wanted to convert image files to pdf equivalents to keep latex compilations from taking too long.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜