File name without extension in bash for loop

后端 未结 2 583
误落风尘
误落风尘 2021-01-30 01:04

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 extensi

相关标签:
2条回答
  • 2021-01-30 01:34

    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.

    0 讨论(0)
  • 2021-01-30 01:35

    This should do it:

    for i in *.m4a; do
      ffmpeg -i $i ${i%%.*}.mp3
    done
    
    0 讨论(0)
提交回复
热议问题