basename não funciona como esperado

2

Como eu faço ".mkv" desaparecer no nome do arquivo alvo?

$ echo a/b.mkv | xargs -I % echo ffmpeg -i "%" $(basename "%" ".mkv").mp4
ffmpeg -i a/b.mkv a/b.mkv.mp4
    
por forthrin 26.12.2014 / 12:46

1 resposta

2

Isso não está relacionado a basename , mas ao fato de que basename "%" ".txt" é executado muito cedo. Experimente:

echo a/b.mkv | xargs -I % sh -c 'echo ffmpeg -i "%" $(basename "%" ".mkv").mp4'

O objetivo principal de basename é remover a parte do diretório: a página man GNU basename (1) diz: "strip director and suffix from filenames"; então, funciona como esperado. Se você quiser manter a parte do diretório:

echo a/b.mkv | xargs -I % sh -c 'echo ffmpeg -i "%" $(dirname "%")/$(basename "%" ".mkv").mp4'

Existem outras soluções, como sed . Por exemplo:

$ echo a/b.mkv | sed 's/\.mkv$/.mp4/'
a/b.mp4
    
por 26.12.2014 / 12:50