在Bash中提取文件名和扩展名

在Bash中提取文件名和扩展名

我想分别获得文件名(没有扩展名)和扩展名。

到目前为止,我找到的最好的解决办法是:

NAME=`echo "$FILE" | cut -d'.' -f1`EXTENSION=`echo "$FILE" | cut -d'.' -f2`

这是错误的,因为如果文件名包含多个.人物。如果,比方说,我有a.b.js,它会考虑ab.js,而不是a.bjs.

它可以很容易地用Python实现

file, ext = os.path.splitext(path)

但是,如果可能的话,我不希望只为此启动Python解释器。

有更好的主意吗?


qq_笑_17
浏览 1105回答 4
4回答

临摹微笑

首先,获取没有路径的文件名:filename=$(basename -- "$fullfile")extension="${filename##*.}"filename="${filename%.*}"或者,您可以将注意力集中在路径的最后一个“/”上,而不是“。”即使您有不可预测的文件扩展名,它也可以工作:filename="${fullfile##*/}"您可能需要查看文档:在网页上“3.5.3壳体参数扩展"在bash手册中称为“参数展开”的部分。

湖上湖

~% FILE="example.tar.gz"~% echo "${FILE%%.*}"example~% echo "${FILE%.*}"example.tar~% echo "${FILE#*.}"tar.gz~% echo "${FILE##*.}"gz

HUWWW

通常您已经知道扩展,所以您可能希望使用:basename filename .extension例如:basename /path/to/dir/filename.txt .txt我们得到filename

慕码人2483693

您可以使用POSIX变量的魔力:bash-3.2$ FILENAME=somefile.tar.gz bash-3.2$ echo ${FILENAME%%.*}somefile bash-3.2$ echo ${FILENAME%.*}somefile.tar如果你的文件名是./somefile.tar.gz然后echo ${FILENAME%%.*}将贪婪地删除与.你就会有一根空的绳子。(您可以使用一个临时变量来解决这个问题:FULL_FILENAME=$FILENAME FILENAME=${FULL_FILENAME##*/}echo ${FILENAME%%.*})这,这个立地解释更多。${variable%pattern}   Trim the shortest match from the end ${variable##pattern}   Trim the longest match from the beginning ${variable%%pattern}   Trim the longest match from the end ${variable#pattern}   Trim the shortest match from the beginning
打开App,查看更多内容
随时随地看视频慕课网APP