我有一个自动生成的文件的目录,所有文件都以.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软件包中。