Shell命令删除文件扩展名

Shell命令删除文件扩展名

我有一个目录,里面有自动生成的文件,所有文件都以 .sample 扩展名结尾。我希望有一种方法可以在一个终端命令中从所有文件中移除 .sample 扩展名。

我尝试过这个:

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

但它不起作用,因为我肯定把 {$1} 放在了错误的位置或方式。有人能指出正确的方向吗?

提前致谢。

答案1

实现此目的的众多方法之一:

for i in *.sample; do NEWNAME=`echo "$i" | sed 's/\.sample//'`; mv "$i" "$NEWNAME"; done

答案2

$ 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}删除:wordparameter

$ 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

值得了解这些扩展。还有更多,包括(有些古怪的)正则表达式支持、子字符串以及设置默认值或获取可变长度的方法。男子狂欢, 当然。

答案3

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

答案4

rename '.sample' '' *.sample

在 Fedora 上,该rename命令包含在util-linux-ng包裹。

相关内容