批量给文件名加上某一个后缀的方法很简单
mv * *.bak
这样能把当前目录下的所有文件加上.bak后缀.可是有一次我手贱,连续把这个命令执行了很多遍,所以把目录下的文件名都搞成xxx.bak.bak.bak.bak.bak.bak.bak了,很是难看,该怎么还原呢?
当然不能手工一个一个改,于是我请强大的shell出马,写了如下一个shell脚本
#!/bin/sh
for file in *.bak
do
short=${file%%.bak*}
mv $file ${short}.bak
done
这样就能成功的把xxx.bak.bak.bak.bak.bak.bak.bak全都变成xxx.bak了,很强大有木有
其实关键就在于参数替换的运用,下面总结一下
${param:-default} | 如果param为空,整个式子的值就等于default |
${#param} | 整个式子的值为param的长度 |
${param%word} | 从param尾部开始删除与word匹配的最小部分,返回剩余部分 |
${param%%word} | 从param尾部开始删除与word匹配的最长部分,返回剩余部分 |
${param#word} | 从param头部开始删除与word匹配的最小部分,返回剩余部分 |
${param##word} | 从param头部开始删除与word匹配的最长部分,返回剩余部分 |
再补充几个用法
${param:=bar} | 检查param是否为空,若不为空,则返回其值;否则将param赋值为bar,然后返回这个值 |
${param:?bar} | 若param为空或不存在,则输出param:bar并异常终止脚本 |
${param:+bar} | param存在且不为空的情况下才返回param,否则返回空(貌似bar在这里没用) |
- 参考资料: 《Linux 程序设计》