技术解析

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

原文件名:123456789-XXXXXXXX.zzzz

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

希望改成 123456789.xxx
也就是截取原文件名前所有数字部分+文件扩展名
建议直接用 py 脚本
walk 下所有文件,随机生成新的文件名后在向数据库提交修改.

另外前几天有人问了相似的问题
你可以看一下
https://www.v2ex.com/t/604644

先 find 找到文件和路径,再使用 basename 获取文件名字,再用 shell/bash 库截取-前的数字和.后的扩展名,最后 mv 一下搞定……为什么这种简单的东西还要用 python……古老系统上不一定有 py 环境啊

rename 's/(\d*)\..*\.(.*)/$1\.$2/' *

要顺便改数据库里的字段名称
因为他是配合下载路径使用的,你光改了磁盘上的文件名,不改数据库内的信息不就成了文件丢失了?


大神麻烦确认下?
拷了几个文件执行后当前目录文件没任何变化......

首选 Python 脚本感觉更简单粗暴吧


数据量大,会另外处理
想先拷贝部分做下测试

感觉你这个就是 Python 做的,用 Python 链接数据库,然后读取文件名,然后执行文件重命名(先备份一份)

我看他说的是:请教在 shell 上批量修改文件名如何编写脚本,原来还要改数据库……

你这样改文件名不会冲突吗

给个文件名我试下,我模拟了几个文件是没问题

前面有个 10 多位的随机数,概率应该很小才是

我怀疑是系统版本问题,我这边测试环境是 CentOS6
11140554591817487-约克.jpg
11133801918310436-1-10.zip
11122486297324196-01.09 PL1801090.pdf
1111985635562443.12.29.png

rename 's/^(\d*)[\s\S]*\.(.*)$/$1\.$2/' *
匹配所有文件,拿到数值开头的$1 以及.xxx 结尾的 xxx $2,重命名为$1.$2, 试了你给的文件没问题,再跑不起来就母鸡了。。。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服