-4

我有一个这样的脚本:

for html in ./templates/*.html
do
    # Here I need only the file name without extension.
done

如何在循环中只获取没有扩展名的文件名?

编辑:我对 UNIX 很陌生。

4

3 回答 3

4

使用basename

basename "$html" .html

或者,可以使用 bash 正则表达式将路径分解为目录前缀、基本名称和文件后缀:

$ [[ "/usr/share/doc/bzip2-devel-1.0.6/manual.html" =~ (.+/)?([^/]+)(\.[^/]+) ]]; echo ${BASH_REMATCH[*]}
/usr/share/doc/bzip2-devel-1.0.6/manual.html /usr/share/doc/bzip2-devel-1.0.6/ manual .html
^                                            ^                                 ^      ^
|                                            |                                 |      |
entire string                                directory                         base   suffix
于 2013-09-27T12:28:52.600 回答
0

尝试这个

对于 ./templates/*.html 中的 html
做
   echo $html|sed 's/\.[a-zA-Z]*$//g';
完毕
于 2013-09-27T13:02:25.207 回答
0

要仅删除扩展名并保留路径和名称,请使用正确的模式匹配运算符:

for f in ./templates/*.html; do
    echo ${f%%.html}
done

%%运算符匹配从变量右侧开始的子字符串,并返回其余部分。因此它有效地匹配并删除了后缀,这对于文件扩展名非常有用。

所以./templates/index.html将简单地返回./templates/index。您可以根据需要添加自己的后缀或扩展名。

这比basename为每个文件调用更有效,因为它避免了产生另一个进程的开销。

于 2013-09-27T12:42:15.147 回答