2012-08-28 67 views
69

下面的代码有什么问题?如何在shell脚本中删除文件名的扩展名?

​​3210

就这样,我得到了字符串'$ filename | cut -f1 -d'。'但如果我删除引号,我什么都没有得到。同时打字

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

在一个shell给我输出我想要的“测试”。我已经知道$ filename已被分配正确的值。我想要做的是将一个变量分配给没有扩展名的文件名。

+5

'基本名$文件名.exe'会做同样的事情。假设你总是知道你想要删除的扩展名。 – mpe

+3

@mpe,你的意思是'basename“$ filename”.exe'。否则带空格的文件名将是个坏消息。 –

回答

49

当您想在脚本/命令中执行命令时,您应该使用$(command)。

所以,你的行会

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

代码解释:

  1. echo得到变量$filename的值,并将其发送到标准输出
  2. 然后我们抢输出和管道它cut指令
  3. cut将使用。作为分隔符(也称为分离器),用于切割串入段,并通过-f我们选择我们想在输出
  4. 然后$()包装将得到的输出并返回该细分市场的价值
  5. 的返回值将是分配给名为变量name
+0

谢谢。我也注意到我需要使用echo命令。 name ='echo $ filename | cut -f1 -d'。'' – mimicocotopus

+0

@mimicocotopus哦,是的,我忽略了那部分,谢谢。 – Rohan

+11

反引号被POSIX弃用,'$()'是首选。 – jordanm

111

您还可以使用参数扩展:

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

所述,这里是命令的解释:https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html –

+1

在这里我即将使用'echo -n“This.File.Has.Periods.In.It.txt”| awk -F。 “{$ NF = “”;打印$ 0}'| tr'''。' | rev | cut -c 2- | rev'。谢谢。 – user208145

63

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

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

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

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

我忘了中间的转速,但是一旦我看到它,这太棒了! –

11
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 

使用。在这里,我假定最后一个(点)后跟文本是扩展名。

0

两个问题与您的代码:

  1. 您使用了“(打勾)而不是'(反勾)包围产生要在变量存储字符串命令。
  2. 您没有将管道中的变量“$ filename”“回显”到“cut”命令中。

我会将您的代码更改为“name =`echo $ filename | cut -f 1 -d'。' `”,如下图所示(再次,注意反引号周围名称变量定义):

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