我正在阅读Using bash, how can I remove the extensions of all files in a specific directory?。可接受的答案是:
for file in "$path"/*; do
[ -f "$file" ] || continue
mv "$file" "${file%.*}"
done
我不明白这行:
mv "$file" "${file%.*}"
尽管阅读了许多资源,例如http://mywiki.wooledge.org/BashGuide/Patterns
这是怎么回事?
答案 0 :(得分:1)
${var%Pattern}, ${var%%Pattern}
${var%Pattern}
从$var
中删除$Pattern
中最短的部分 匹配$var
的后端。
${var%%Pattern}
从$var
中删除$Pattern
中最长的部分 匹配$var
的后端。
基本上是要用完整的文件名填充$file
,然后删除%
中最短匹配项.*
之后的所有内容,该扩展名可以是任意扩展名。
# assume you want to convert myfile.txt to myfile
$file="myfile.txt"
# move the current name to the current name excluding the shortest match of .* = .txt
mv "$file" "${file%.*}"
# expands to
mv "myfile.txt" "myfile"
答案 1 :(得分:0)
这是Parameter Expansion的一种形式。
"${file%.*}"
的意思是“变量file
减去最右边的句号之后的所有内容”。
${file%%.*}"
将引用最左侧期间。
这是${%}
运算符和Glob的组合。
edit:在进行“子字符串删除”扩展时,我遇到了麻烦,直到我注意到#
位于$
的“左侧”,而%
位于右侧。在使用Bash作为脚本语言时,参数扩展是必不可少的组成部分。我建议练习。