下面的代码有什么问题?
name='$filename | cut -f1 -d'.''
就像这样,我得到的字面值字符串$filename | cut -f1 -d'。',但如果我删除引号,我什么也得不到。与此同时,打字
"test.exe" | cut -f1 -d'.'
在shell中给出我想要的输出,test。我已经知道$filename已经被分配了正确的值。我要做的是给一个变量分配没有扩展名的文件名。
下面的代码有什么问题?
name='$filename | cut -f1 -d'.''
就像这样,我得到的字面值字符串$filename | cut -f1 -d'。',但如果我删除引号,我什么也得不到。与此同时,打字
"test.exe" | cut -f1 -d'.'
在shell中给出我想要的输出,test。我已经知道$filename已经被分配了正确的值。我要做的是给一个变量分配没有扩展名的文件名。
当前回答
如果知道扩展名,可以使用basename
$ basename /home/jsmith/base.wiki .wiki
base
其他回答
#!/bin/bash
file=/tmp/foo.bar.gz
echo $file ${file%.*}
输出:
/tmp/foo.bar.gz /tmp/foo.bar
注意,只有最后一个扩展被删除。
如果知道扩展名,可以使用basename
$ basename /home/jsmith/base.wiki .wiki
base
仅使用POSIX的内置:
#!/usr/bin/env sh
path=this.path/with.dots/in.path.name/filename.tar.gz
# Get the basedir without external command
# by stripping out shortest trailing match of / followed by anything
dirname=${path%/*}
# Get the basename without external command
# by stripping out longest leading match of anything followed by /
basename=${path##*/}
# Strip uptmost trailing extension only
# by stripping out shortest trailing match of dot followed by anything
oneextless=${basename%.*}; echo "$oneextless"
# Strip all extensions
# by stripping out longest trailing match of dot followed by anything
noext=${basename%%.*}; echo "$noext"
# Printout demo
printf %s\\n "$path" "$dirname" "$basename" "$oneextless" "$noext"
打印输出的演示:
this.path/with.dots/in.path.name/filename.tar.gz
this.path/with.dots/in.path.name
filename.tar.gz
filename.tar
filename
假设你的文件有。new扩展名
ls -1 | awk '{ print "mv "$1" `basename "$1" .new`"}' | sh
由于张贴后不显示特别报价,请参阅图片。
你也可以使用参数展开:
$ filename=foo.txt
$ echo "${filename%.*}"
foo
只是要注意,如果没有文件扩展名,它将进一步向后寻找点,例如。
如果文件名只是以点开始(例如。bashrc),它将删除整个文件名。 如果只在路径中有一个点(例如path。到/myfile或。/myfile),那么它将在路径内部进行修剪。