- 论坛徽章:
- 0
|
批量改文件名的问题(由长改短)
原帖由 "tacy_lee" 发表:
for filename in `find . -name "*.bak"`
do
mv $file `echo $filename | sed 's/\.bak//'`
done
for i in *.bak
do
[ -f "$i" ] && mv "$i" ${i/.bak}
done
注意能进行${i/.bak}这种变量操作的只是bash, 至于限于哪些版本我不知道, 我认为它很可能不是POSIX的一部分. 不过bash实在太爽了.
不过上面的脚本在含有"a b.bak" 这样的文件名时却会失败, 原因很简单.
for会把a作为一个文件名, 再把b.bak当作另外一个. 所以很多BASH下那种用完就丢的方案真的要具体问题具体分析, 如果你确定你的情况是很传统的文件名, 那么上面的方案几乎可能是最好的一个. 用尽可能少的外部程序是我的一贯追求
实际上shell方案失败的情况很多, ls *.bak 命令就会失败, 只是因为当前目录下的文件名太多了, ls在实际执行之前shell要把*.bak都列出来, 文件一多, 它就崩了.
如果你的文件名中包含有空格, 那么
find -maxdepth 1 -type f -name "*.bak" | while read i
do
[ -f "$i" ] && mv "$i" "${i/.bak}"
done
会有帮助 |
|