给出如下文件名:

/the/path/foo.txt
bar.txt

我希望得到:

foo
bar

为什么这行不通?

#!/bin/bash

fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
echo $fbname

正确的做法是什么?


当前回答

下面是另一种(更复杂的)获取文件名或扩展名的方法,首先使用rev命令反转文件路径,从第一个开始切割。然后再次反转文件路径,就像这样:

filename=`rev <<< "$1" | cut -d"." -f2- | rev`
fileext=`rev <<< "$1" | cut -d"." -f1 | rev`

其他回答

如果你想更好地使用Windows文件路径(在Cygwin下),你也可以试试这个:

fname=${fullfile##*[/|\\]}

这将在Windows上使用BaSH时考虑反斜杠分隔符。

您不必调用外部basename命令。相反,你可以使用以下命令:

$ s=/the/path/foo.txt
$ echo "${s##*/}"
foo.txt
$ s=${s##*/}
$ echo "${s%.txt}"
foo
$ echo "${s%.*}"
foo

注意,这个解决方案应该适用于所有最近(2004年以后)的POSIX兼容shell,(例如bash、dash、ksh等)。

2.6.2参数展开

关于bash字符串操作的更多信息:http://tldp.org/LDP/LG/issue18/bash.html

以下是一些简单的句子:

(美元:" ${%。*}") $(basename "${s}" ".${s##*.}")

我需要这个,和bongbang和w4etwetewtwet问的一样。

使用basename命令。它的手册页在这里:http://unixhelp.ed.ac.uk/CGI/man-cgi?basename

下面是另一种(更复杂的)获取文件名或扩展名的方法,首先使用rev命令反转文件路径,从第一个开始切割。然后再次反转文件路径,就像这样:

filename=`rev <<< "$1" | cut -d"." -f2- | rev`
fileext=`rev <<< "$1" | cut -d"." -f1 | rev`