我有一个目录,里面有自动生成的文件,所有文件都以 .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}
删除:word
parameter
$ 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包裹。