正则表达式用于移动文件

时间:2012-11-01 14:29:22

标签: shell

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

以下是仅删除扩展名的代码。

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

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

filename

由于

3 个答案:

答案 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