Bash ension=$(echo-n${tmp1:0:1};echo${tmp2%.*});echo“不带扩展名的文件名:$filename\u noextension”

Bash ension=$(echo-n${tmp1:0:1};echo${tmp2%.*});echo“不带扩展名的文件名:$filename\u noextension”,bash,shell,sh,cut,gnu-coreutils,Bash,Shell,Sh,Cut,Gnu Coreutils,filename=.bashrc.txt;echo“filename:$filename”;tmp1=${filename##*/};tmp2=${tmp1:1};filename_noextension=$(echo-n${tmp1:0:1};echo${tmp2%.*});echo“不带扩展名的文件名:$filename\u noextension” filename=.bashrc.txt.tar;echo“filename:$filename”;tmp1=${filename##*/};

filename=.bashrc.txt;echo“filename:$filename”;tmp1=${filename##*/};tmp2=${tmp1:1};filename_noextension=$(echo-n${tmp1:0:1};echo${tmp2%.*});echo“不带扩展名的文件名:$filename\u noextension”

filename=.bashrc.txt.tar;echo“filename:$filename”;tmp1=${filename##*/};tmp2=${tmp1:1};filename_noextension=$(echo-n${tmp1:0:1};echo${tmp2%.*});echo“不带扩展名的文件名:$filename\u noextension”

filename=~/.bashrc;echo“filename:$filename”;tmp1=${filename##*/};tmp2=${tmp1:1};filename_noextension=$(echo-n${tmp1:0:1};echo${tmp2%.*});echo“不带扩展名的文件名:$filename\u noextension”

filename=~/.bashrc.txt.tar;echo“filename:$filename”;tmp1=${filename##*/};tmp2=${tmp1:1};filename_noextension=$(echo-n${tmp1:0:1};echo${tmp2%.*});echo“不带扩展名的文件名:$filename\u noextension”

filename=bashrc;echo“filename:$filename”;tmp1=${filename##*/};tmp2=${tmp1:1};filename_noextension=$(echo-n${tmp1:0:1};echo${tmp2%.*});echo“不带扩展名的文件名:$filename\u noextension”

filename=bashrc.txt;echo“filename:$filename”;tmp1=${filename##*/};tmp2=${tmp1:1};filename_noextension=$(echo-n${tmp1:0:1};echo${tmp2%.*});echo“不带扩展名的文件名:$filename\u noextension”

filename=bashrc.txt.tar;echo“filename:$filename”;tmp1=${filename##*/};tmp2=${tmp1:1};filename_noextension=$(echo-n${tmp1:0:1};echo${tmp2%.*});echo“不带扩展名的文件名:$filename\u noextension”

filename=~/bashrc;echo“filename:$filename”;tmp1=${filename##*/};tmp2=${tmp1:1};filename_noextension=$(echo-n${tmp1:0:1};echo${tmp2%.*});echo“不带扩展名的文件名:$filename\u noextension”

filename=~/bashrc.txt.tar;echo“filename:$filename”;tmp1=${filename##*/};tmp2=${tmp1:1};filename_noextension=$(echo-n${tmp1:0:1};echo${tmp2%.*});echo“不带扩展名的文件名:$filename\u noextension”

假设您的文件具有.new扩展名

ls-1 | awk'{打印“mv”$1”
basename“$1”。新的
“}”| sh



由于在发布后不显示特殊引号,请参见图片。

反勾号不受POSIX的欢迎,
$()
是首选。分叉和管道化以获得几个字符是最糟糕的解决方案。这个答案的问题是假设输入字符串只有一个点@下面的切普纳有一个更好的解决方案。。。name=${filename%.*}这个答案是初学者的特点,不应该推广。使用chepner回答中描述的内置机制在
/ihavenoextension
上失败,就像另一个回答一样。
basename$filename.exe
也会做同样的事情。这是假设您总是知道要删除的扩展名。@mpe,您的意思是
basename“$filename.exe
。否则带空格的文件名将是个坏消息。下面是命令的解释:这里我正要使用
echo-n“This.File.Has.Periods.In.It.txt”{$NF=”“;print$0}'| tr'.| rev | cut-c2-| rev
。谢谢。这是否适用于具有多个扩展名的文件,如
image.png.gz
%.*
将只删除最后一个扩展名;如果要删除所有扩展名,请使用
%%.*
。请注意,如果没有扩展名且路径是相对的,则会删除整个名称。例如,
filename=./ihavenoextension
。我忘记了中间版本,但一旦我看到它,这就太棒了!如果为
剪切
提供
-s
选项,则更好,这样每当文件名不包含点时,它都会返回一个空字符串。我认为这应该是可以接受的答案,因为它在带有点的路径上工作,隐藏的文件以点开始,甚至是具有多个扩展名的文件。这样的文件会发生什么:
filename=/tmp.d/foo
?@FedonKadifeli,这只适用于文件名,而不适用于完整路径。但是您可以使用类似的方法首先获取文件名,方法是使用
/
作为分隔符。这与Steven Penny 3年前给出的答案有何不同?@gniourf\u gniourf upvoting,因为您通过演示如何正确使用变量使其成为一个有用的答案。这一个去掉了“tar.gz”通过在文件名中点的第一个实例之前选择字符,而不计算路径。你可能不想这样剥离扩展。如果你知道它以
.tar.gz
结尾,你可以使用
$(basename“$a.tar.gz)
。此外,如果变量可能包含空格或其他奇怪的字符,请确保在任何地方都用引号将其括起来!我如何删除
.wiki
,最终得到
/home/jsmith/base
?更新:回答:请参阅。很好用!当
file1=/tmp.d/mainnetwosh
时会发生什么?sed表达式应替换为
's/\.[^./]*$/'
这样的文件会发生什么:
文件=/tmp.d/foo
name='$filename | cut -f1 -d'.''
"test.exe" | cut -f1 -d'.'
name=$(echo "$filename" | cut -f 1 -d '.')
$ 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
$ filename=foo.txt
$ echo "${filename%.*}"
foo
$ basename /home/jsmith/base.wiki .wiki
base
echo $filename | rev | cut -f 2- -d '.' | rev
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
$> filename=foo.txt
$> echo $filename
foo.txt
$> name=`echo $filename | cut -f1 -d'.'`
$> echo $name
foo
$> 
program
#!/bin/bash
file=/tmp/foo.bar.gz
echo $file ${file%.*}
/tmp/foo.bar.gz /tmp/foo.bar
a=this.path/with.dots/in.path.name/filename.tar.gz
echo $(dirname $a)/$(basename $a | cut -d. -f1)
/xyz.dir/file.ext
./file.ext
/a.b.c/x.ddd.txt
$ echo "/xyz.dir/file.ext" | sed -e 's/\.[^./]*$//'
/xyz.dir/file
$ echo "./file.ext" | sed -e 's/\.[^./]*$//'
./file
$ echo "/a.b.c/x.ddd.txt" | sed -e 's/\.[^./]*$//'
/a.b.c/x.ddd
$ echo "/a.b.c/x.ddd.txt" | sed -e 's/\.[^/]*$//'
/a.b.c/x
$ echo "/a.b.c/.profile" | sed -e 's/\.[^./]*$//'
/a.b.c/
$ echo "/a.b.c/.profile" | sed -re 's/(^.*[^/])\.[^./]*$/\1/'
/a.b.c/.profile