我怎么能得到只有文件名没有扩展名和路径?

下面给我没有扩展,但我仍然有附加的路径:

source_file_filename_no_ext=${source_file%.*}

当前回答

$ file=${$(basename $file_path)%.*}

其他回答

下面是一个从路径中获取文件名的简单方法:

echo "$PATH" | rev | cut -d"/" -f1 | rev

要删除你可以使用的扩展名,假设文件名只有一个点(扩展名点):

cut -d"." -f1
$ file=${$(basename $file_path)%.*}

Basename和dirname解决方案更方便。这些是可供选择的命令:

FILE_PATH="/opt/datastores/sda2/test.old.img"
echo "$FILE_PATH" | sed "s/.*\///"

这将像basename一样返回test.old.img。

这是没有扩展名的salt文件名:

echo "$FILE_PATH" | sed -r "s/.+\/(.+)\..+/\1/"

它返回test.old。

下面的语句给出了完整的路径,如dirname命令。

echo "$FILE_PATH" | sed -r "s/(.+)\/.+/\1/"

它返回/opt/datastores/sda2

$ source_file_filename_no_ext=${source_file%.*}
$ echo ${source_file_filename_no_ext##*/}

许多类unix操作系统都有一个basename可执行文件,用于非常类似的目的(路径为dirname):

pax> full_name=/tmp/file.txt
pax> base_name=$(basename ${full_name})
pax> echo ${base_name}
file.txt

不幸的是,这只提供了文件名,包括扩展名,因此您还需要找到一种方法将其剥离。

所以,既然你必须这样做,你也可以找到一个方法,可以剥离路径和扩展。

一种方法是(这是一个只使用bash的解决方案,不需要其他可执行文件):

pax> full_name=/tmp/xx/file.tar.gz
pax> xpath=${full_name%/*} 
pax> xbase=${full_name##*/}
pax> xfext=${xbase##*.}
pax> xpref=${xbase%.*}
pax> echo "path='${xpath}', pref='${xpref}', ext='${xfext}'"

path='/tmp/xx', pref='file.tar', ext='gz'

这一小段代码设置了xpath(文件路径)、xpref(文件前缀,您具体要求的内容)和xfext(文件扩展名)。