shell 脚本通过正则修改文件名脚本编写

2019-09-29 15:28:55 +08:00
 openbsd
公司有一套古老系统迁移到 Linux 出现附件无法获取,原因大致为文件名包含中文,特殊符号等导致程序无法正常读取文件,现在想通过修改文件名和数据库记录后实现
请教在 shell 上批量修改文件名如何编写脚本

原文件名:123456789-XXXXXXXX.zzzz

前段一定是一串随机 数字
- 可能是其它字符 类似 _ 空格等
XXXXXXXX 可能是 中 /英 文或者其他各种乱七八糟的字符
zzzz 文件扩展名 可能是 3 位 /4 位英文字母

希望改成 123456789.xxx
也就是截取原文件名前所有数字部分+文件扩展名
4294 次点击
所在节点    Linux
14 条回复
CallMeReznov
2019-09-29 15:36:28 +08:00
建议直接用 py 脚本
walk 下所有文件,随机生成新的文件名后在向数据库提交修改.
CallMeReznov
2019-09-29 15:37:33 +08:00
另外前几天有人问了相似的问题
你可以看一下
https://www.v2ex.com/t/604644
0x11901
2019-09-29 16:06:51 +08:00
先 find 找到文件和路径,再使用 basename 获取文件名字,再用 shell/bash 库截取-前的数字和.后的扩展名,最后 mv 一下搞定……为什么这种简单的东西还要用 python……古老系统上不一定有 py 环境啊
feikerwu
2019-09-29 16:12:31 +08:00
rename 's/(\d*)\..*\.(.*)/$1\.$2/' *
CallMeReznov
2019-09-29 16:18:47 +08:00
@0x11901 #3 要顺便改数据库里的字段名称
因为他是配合下载路径使用的,你光改了磁盘上的文件名,不改数据库内的信息不就成了文件丢失了?
openbsd
2019-09-29 16:33:30 +08:00
@feikerwu #4
大神麻烦确认下?
拷了几个文件执行后当前目录文件没任何变化......
Hopetree
2019-09-29 16:34:56 +08:00
首选 Python 脚本感觉更简单粗暴吧
openbsd
2019-09-29 16:35:25 +08:00
@CallMeReznov
数据量大,会另外处理
想先拷贝部分做下测试
Hopetree
2019-09-29 16:36:55 +08:00
感觉你这个就是 Python 做的,用 Python 链接数据库,然后读取文件名,然后执行文件重命名(先备份一份)
0x11901
2019-09-29 16:54:10 +08:00
@CallMeReznov 我看他说的是:请教在 shell 上批量修改文件名如何编写脚本,原来还要改数据库……
xml123
2019-09-29 16:59:23 +08:00
你这样改文件名不会冲突吗
feikerwu
2019-09-29 17:07:37 +08:00
@openbsd 给个文件名我试下,我模拟了几个文件是没问题
openbsd
2019-09-29 17:31:22 +08:00
@xml123 #11 前面有个 10 多位的随机数,概率应该很小才是
@feikerwu #12
我怀疑是系统版本问题,我这边测试环境是 CentOS6
11140554591817487-约克.jpg
11133801918310436-1-10.zip
11122486297324196-01.09 PL1801090.pdf
1111985635562443.12.29.png
feikerwu
2019-09-29 18:02:53 +08:00
@openbsd rename 's/^(\d*)[\s\S]*\.(.*)$/$1\.$2/' *

匹配所有文件,拿到数值开头的$1 以及.xxx 结尾的 xxx $2,重命名为$1.$2, 试了你给的文件没问题,再跑不起来就母鸡了。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/605401

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX