Shell命令删除文件扩展名

rog*_*pvl 2 unix shell bash terminal

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

我试过这个:

mv ./{$1}*.sample ./$1
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为我肯定将 {$1} 放在错误的位置或方式。任何人都可以指出正确的方向吗?

提前致谢。

mar*_*ton 19

$ 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
Run Code Online (Sandbox Code Playgroud)

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

$ FILENAME=140909_stats_report.txt
$ echo "${FILENAME#140909_}"
stats_report.txt
Run Code Online (Sandbox Code Playgroud)

我记得从我的(英国)键盘上的#%键的位置我需要哪些:#左边是左边的%so 匹配项。在我注意到我每次都必须检查手册页之前:~)

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

$ echo "${FILENAME%.*}"
140909_stats_report
Run Code Online (Sandbox Code Playgroud)

#%形式相匹配的最短扩张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
Run Code Online (Sandbox Code Playgroud)

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

  • +1 - 使用 bash 参数替换是最好的解决方案。不会产生不必要的进程,结果非常干净。 (3认同)

ags*_*mek 6

for n in *.sample ; do mv "$n" "$(basename "$n" .sample)" ; done
Run Code Online (Sandbox Code Playgroud)


Den*_*son 5

rename命令接受 Perl 表达式:

rename 's/\.sample$//' *.sample
Run Code Online (Sandbox Code Playgroud)

例子:

$ ls *sample*
file0.sample  file2.sample  foo.sample.sample
file1.sample  file3.sample  with space.sample
$ rename 's/\.sample$//' *.sample
$ ls *sample*
foo.sample
Run Code Online (Sandbox Code Playgroud)

在我的 Ubuntu 系统上,rename符号链接到包中的prename脚本perl