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,当然。
for n in *.sample ; do mv "$n" "$(basename "$n" .sample)" ; done
Run Code Online (Sandbox Code Playgroud)
该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
。
归档时间: |
|
查看次数: |
4458 次 |
最近记录: |