从字符串中删除文件扩展名的最佳方法?

Tom*_*mas 7 shell filenames

所以,我正在使用我制作的脚本将视频转换为 webm 格式。某个程序调用脚本,发送%f视频的完整绝对文件名,如下所示:

converter.sh %f
Run Code Online (Sandbox Code Playgroud)

where%f有两个可能的扩展名,.avi.mpg.

# /bin/bash
ffmpeg -i $1 `dirname $1``basename $1 avi`webm && rm $1
Run Code Online (Sandbox Code Playgroud)

$1包含.avi文件时,它目前可以完美运行,因为basename删除了.avi扩展名。当$1.mpg相反结尾时,结果是.mpgwebm

如何修改该脚本以接收这两种可能的不同格式?


恢复:如果$1/somedir/video.avi,脚本应该做:

ffmpeg -i /somedir/video.avi /somedir/video.webm
Run Code Online (Sandbox Code Playgroud)

如果$1/somedir/video.mpg,脚本应该这样做:

ffmpeg -i /somedir/video.mpg /somedir/video.webm
Run Code Online (Sandbox Code Playgroud)

我知道这对某些人来说可能是傻瓜,但我对 bash 有点陌生。

Sté*_*nez 9

您可以使用大多数 shell 提供的替换机制:

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

事实上,basenamedirname也可以通过置换效仿。

注意:直接.*删除后缀在像this.dir/file.

  • @Tomas:没有引号,如果您的文件名包含空格,它们将被拆分为多个路径。 (2认同)
  • 为什么使用`dirname`,`basename`而不是直接使用`ffmpeg -i "$1" "${1%.*}.webm" && rm "$1" (2认同)