Melhor maneira de remover a extensão de arquivo de uma string?

7

Então, estou usando um script que fiz para converter vídeos para o formato webm. Um determinado programa chama o script, enviando %f , que é o nome completo e absoluto do vídeo, assim:

converter.sh %f

em que %f tem duas extensões possíveis, .avi ou .mpg .

# /bin/bash
ffmpeg -i $1 'dirname $1''basename $1 avi'webm && rm $1

Atualmente, ele funciona perfeitamente quando $1 contém um arquivo .avi , porque basename remove a extensão .avi . Quando $1 terminar com .mpg , o resultado será .mpgwebm .

Como posso modificar esse script para poder receber esses dois possíveis formatos diferentes?

Continuando: se $1 for /somedir/video.avi , o script deverá fazer:

ffmpeg -i /somedir/video.avi /somedir/video.webm

E se $1 for /somedir/video.mpg , o script deverá ser:

ffmpeg -i /somedir/video.mpg /somedir/video.webm

Eu sei que isso pode ser tolo para algumas pessoas, mas eu sou meio que novo com o bash.

    
por Tomas 15.08.2011 / 05:52

1 resposta

9

Você pode usar mecanismos de substituição fornecidos pela maioria dos shells:

B=$(basename "$1"); D=$(dirname "$1");
ffmpeg -i "$1" "$D/${B%.*}.webm" && rm "$1"

Na verdade, basename e dirname também podem ser emulados por substituições.

Observação: a remoção direta do sufixo .* não está correta em caminhos como this.dir/file .

    
por 15.08.2011 / 05:57