1

我在 shell 脚本中有这段代码。它的作用是删除文件名中包括点 (.) 在内的所有扩展名,并仅返回名称,如/home/user/filename. 但问题是我希望它甚至删除目录结构并只返回这样的文件名filename

这是仅删除扩展名的代码。

filename="/home/user/filename.php.txt.doc"      
newname=${filename%%.*}
echo $newname
/home/user/filename

有没有办法只获取文件名而不包括目录扩展名?

filename

谢谢

4

3 回答 3

3

尝试"${filename##*/}"获取文件的名称。

$ filename="/home/user/filename.php.txt.doc"      
$ newname=${filename%%.*}
$ newname=${newname##*/}
$ echo $newname
filename

或者,使用basename

$ filename="/home/user/filename.php.txt.doc"      
$ newname="$(basename ${filename%%.*})"
$ echo $newname

您也可以使用单个 sed 命令执行此操作,但它有点不可读,所以我不会:

$ sed 's|.*/\([^\.]*\).*|\1|g' <<< "$filename"
filename
于 2012-11-01T14:31:30.400 回答
0

您可以使用awk以获取filename带有字段分隔符的最后一个字段/

newname=$(echo "$newname" | awk -F"/" '{print $NF}')

将此行添加到您的代码中:

filename="/home/user/filename.php.txt.doc"      
newname=${filename%%.*}
newname=$(echo "$newname" | awk -F"/" '{print $NF}')
echo $namename

输出:

filename
于 2012-11-01T14:34:45.963 回答
0
newname=$(basename "$filename")
newname=${newname%%.*}
echo $newname
filename
于 2012-11-01T14:35:54.270 回答