免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5642 | 回复: 15
打印 上一主题 下一主题

批量改文件名的问题(由长改短) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-09-15 17:24 |只看该作者 |倒序浏览
一个文件夹下有很多文件,我把他们批量改成*.bak:
ls | xargs -I {} mv {} {}.bak
可是怎么把他们批量改回来,把后面的.bak去掉,我一直想不出来,不知能不能实现,请教各位前辈。

论坛徽章:
0
2 [报告]
发表于 2005-09-15 17:33 |只看该作者

批量改文件名的问题(由长改短)

http://bbs.chinaunix.net/forum/viewtopic.php?t=611978&show_type=

应该你也可以用,,参考一下,,

论坛徽章:
0
3 [报告]
发表于 2005-09-15 17:43 |只看该作者

批量改文件名的问题(由长改短)

不好意思,没看明白有什么共性可以参考啊,请指教。

论坛徽章:
0
4 [报告]
发表于 2005-09-15 18:02 |只看该作者

批量改文件名的问题(由长改短)

file=`ls -l | grep ^- |grep bak$ |awk '{print $9}' |awk -F. '{print $1}'`

for name in $file
do
mv $name.bak $name
done



其实用的东西都差不多,,,要学会方法,,而不是现用现学

论坛徽章:
0
5 [报告]
发表于 2005-09-15 20:18 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2005-09-15 21:55 |只看该作者

批量改文件名的问题(由长改短)

同意tacy_lee的做法

论坛徽章:
0
7 [报告]
发表于 2005-09-16 03:26 |只看该作者

批量改文件名的问题(由长改短)

原帖由 "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
会有帮助

论坛徽章:
0
8 [报告]
发表于 2005-09-16 03:33 |只看该作者

批量改文件名的问题(由长改短)

看来find的{}把你给害了, 它只出现在find的参数中时有特殊意义, 你那样用在一般情况下是离谱了. 同样还有 \; 出现在find程序中的特殊意义.

类似的有一种工具程序用来表示后面的都不再是选项, 而是参数的记法 -- 却是一种普遍约定的规则, 想象一下你用rm -- -f 可以删除的是名字为"-f"的文件, 而不是"强制删除". 尽管它不是POSIX的一部分.
同样类似的还有可以用 - 表示标准输出, 比如cat tmp.txt | diff - tmp.txt, 结果当然一样.

但你的{}情况可真的不同! 我真没见过除find之外的程序这样去用它

论坛徽章:
0
9 [报告]
发表于 2005-09-16 08:22 |只看该作者

批量改文件名的问题(由长改短)

ls *.bak|awk -F"\." {printf("mv %s %s;",$0,$1)}'|sh

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
10 [报告]
发表于 2005-09-16 08:24 |只看该作者

批量改文件名的问题(由长改短)

  1. rename .bak '' *.bak
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP