我在shell脚本中有这个代码。它的作用是删除所有扩展名,包括文件名中的点(。),并返回名称,如/home/user/filename
。但问题是,我希望它甚至删除目录结构,只返回文件名,如filename
。
以下是仅删除扩展名的代码。
filename="/home/user/filename.php.txt.doc"
newname=${filename%%.*}
echo $newname
/home/user/filename
有没有办法只获取文件名而不包含目录扩展名?
filename
由于
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:0)
newname=$(basename "$filename")
newname=${newname%%.*}
echo $newname
filename