我怎么能得到只有文件名没有扩展名和路径?
下面给我没有扩展,但我仍然有附加的路径:
source_file_filename_no_ext=${source_file%.*}
我怎么能得到只有文件名没有扩展名和路径?
下面给我没有扩展,但我仍然有附加的路径:
source_file_filename_no_ext=${source_file%.*}
当前回答
许多类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(文件扩展名)。
其他回答
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
下面是一个从路径中获取文件名的简单方法:
echo "$PATH" | rev | cut -d"/" -f1 | rev
要删除你可以使用的扩展名,假设文件名只有一个点(扩展名点):
cut -d"." -f1
$ file=${$(basename $file_path)%.*}
许多类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(文件扩展名)。
$ source_file_filename_no_ext=${source_file%.*}
$ echo ${source_file_filename_no_ext##*/}