Shell命令删除文件扩展名

我有一个自动生成的文件的目录,所有文件都以.sample扩展名结尾。 我想有一种方法可以在一个terminal命令中删除它们的.sample扩展名。

我试过这个:

mv ./{$1}*.sample ./$1 

但是这是行不通的,因为我肯定把{$ 1}放在错误的地方或方式上。 任何人都可以指向正确的方向?

提前致谢。

其中一种方法是:

 for i in *.sample; do NEWNAME=`echo "$i" | sed 's/\.sample//'`; mv "$i" "$NEWNAME"; done 
 $ touch {a,b,c,"white space"}.sample $ ls *.sample a.sample c.sample b.sample white space.sample $ for SAMPLE in *.sample; do mv -v "$SAMPLE" "${SAMPLE%.sample}"; done a.sample -> a b.sample -> b c.sample -> c white space.sample -> white space 

编辑 :另见${parameter#word} ,从parameter的前面删除word

 $ FILENAME=140909_stats_report.txt $ echo "${FILENAME#140909_}" stats_report.txt 

我记得我的(英国)键盘上的#%键位置所需的这些中的哪一个: #是左边的%所以匹配左边。 在我注意到每次都必须检查手册页之前〜)

这些扩展也支持shell通配符:

 $ echo "${FILENAME%.*}" 140909_stats_report 

#%表格匹配word的最短扩展。 您可以使用##%%作为最长匹配。 例如:

 $ FILENAME=140909_stats_report.txt $ echo "${FILENAME#*_}" # match as little as possible stats_report.txt $ echo "${FILENAME##*_}" # match as much as possible report.txt 

抓住这些扩张是值得的。 还有几个,包括(有点胡思乱想的)正则expression式支持,子string和设置默认值或获取可变长度的方法。 当然是男人bash 。

 for n in *.sample ; do mv "$n" "$(basename "$n" .sample)" ; done 

rename命令接受Perlexpression式:

 rename 's/\.sample$//' *.sample 

例:

 $ ls *sample* file0.sample file2.sample foo.sample.sample file1.sample file3.sample with space.sample $ rename 's/\.sample$//' *.sample $ ls *sample* foo.sample 

在我的Ubuntu系统上, rename prename链接到perl软件包中的prename脚本。

 rename '.sample' '' *.sample 

在Fedora上, rename命令包含在util-linux-ng软件包中。