如何删除一个文件名的shell脚本扩展?(How can I remove the extensio

2019-06-17 21:47发布

有什么不对下面的代码?

name='$filename | cut -f1 -d'.''

由于是,我得到的文本字符串$filename | cut -f1 -d'.' $filename | cut -f1 -d'.' ,但如果我删除引号我没有得到任何东西。 同时打字

"test.exe" | cut -f1 -d'.'

在shell给我输出我想要的, test 。 我已经知道$filename已经分配了正确的价值。 我想要做的就是分配给一个变量名不带扩展名。

Answer 1:

你应该使用命令替换语法$(command)当你想在脚本/命令来执行命令。

所以,你的行会

name=$(echo "$filename" | cut -f 1 -d '.')

代码解释:

  1. echo得到变量的值$filename ,并将其发送到标准输出
  2. 然后,我们抢输出和管道它的cut命令
  3. cut将使用。 作为分隔符(也称为分离器),用于切割串入段和由-f我们选择哪个段我们希望在输出
  4. 然后$()命令替换将得到的输出,并返回其值
  5. 返回的值将被分配给变量命名的name

请注意,这给该变量的部分达第一时间段.

$ filename=hello.world
$ echo "$filename" | cut -f 1 -d '.'
hello
$ filename=hello.hello.hello
$ echo "$filename" | cut -f 1 -d '.'
hello
$ filename=hello
$ echo "$filename" | cut -f 1 -d '.'
hello


Answer 2:

您还可以使用参数扩展:

$ filename=foo.txt
$ echo "${filename%.*}"
foo


Answer 3:

如果您知道分机,你可以使用基名

$ basename /home/jsmith/base.wiki .wiki
base


Answer 4:

如果你的文件名包含一个点(比扩展的另外一个),然后使用此:

echo $filename | rev | cut -f 2- -d '.' | rev


Answer 5:

file1=/tmp/main.one.two.sh
t=$(basename "$file1")                        # output is main.one.two.sh
name=$(echo "$file1" | sed -e 's/\.[^.]*$//') # output is /tmp/main.one.two
name=$(echo "$t" | sed -e 's/\.[^.]*$//')     # output is main.one.two

无论你想要使用。 在这里,我认为最后. (点),其次是文字的延伸。



Answer 6:

作为chepner答案的评论所指出的Hawker65,最投票的解决方案既没有照顾多个扩展名(如文件名.tar.gz),也没有在路径的其余部分点(如this.path的/有.dots / in.path.name)。 一种可能的解决办法是:

a=this.path/with.dots/in.path.name/filename.tar.gz
echo $(dirname $a)/$(basename $a | cut -d. -f1)


Answer 7:

有两个问题与您的代码:

  1. 您使用了“(打勾)而不是'(反勾)包围产生要在变量存储字符串命令。
  2. 你没有“回声”变量“$文件名”的管进入“切割”命令。

我会改变你的代码为“NAME =`回声$文件名|切-f 1 -d‘’ `”,如下所示(再次注意背面蜱周围的名称变量定义):

$> filename=foo.txt
$> echo $filename
foo.txt
$> name=`echo $filename | cut -f1 -d'.'`
$> echo $name
foo
$> 


Answer 8:

#!/bin/bash
filename=program.c
name=$(basename "$filename" .c)
echo "$name"

输出:

program


Answer 9:

#!/bin/bash
file=/tmp/foo.bar.gz
echo $file ${file%.*}

输出:

/tmp/foo.bar.gz /tmp/foo.bar

请注意,只有最后一次延长被删除。



Answer 10:

我的建议是使用基名。
这是在默认情况下在Ubuntu中,视觉上简单的代码和处理大多数情况下。 下面是一些子情况来处理空间和multidot /副延伸:

pathfile = “../空间FLD /空间-file.tar.gz”

回声$ {// pathfile +(/ |)}
通常它也会从第一摆脱延伸。 但未能在我们的路径..

回声“$(名前缀”$ {pathfile%。*}“)”
空间-file.tar#我相信我们需要exatly那

这里是一个重要的注意:我用双引号双引号来处理空间。 单引号不会通过因发短信$。 Bash是不寻常的,写着“第二个‘第一’引号”,因为扩张。

但是,你仍然需要考虑.hidden_​​files的

隐藏= “〜/ .bashrc中”回声“$(基名”$ {隐藏%。}“)” #会产生“〜”!
不是预期的“”结果。 要做到这一点,可以用$ HOME或/家庭/ user_path /
因为又是bash“不寻常”不扩大“〜”(搜索庆典BashPitfalls)
hidden2 = “$ HOME / .bashrc中”; 回声'$(名前缀“$ {pathfile%。}”)'



文章来源: How can I remove the extension of a filename in a shell script?