V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
openbsd
V2EX  ›  Linux

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

  •  
  •   openbsd · 2019-09-29 15:28:55 +08:00 · 4254 次点击
    这是一个创建于 1642 天前的主题,其中的信息可能已经有所发展或是发生改变。
    公司有一套古老系统迁移到 Linux 出现附件无法获取,原因大致为文件名包含中文,特殊符号等导致程序无法正常读取文件,现在想通过修改文件名和数据库记录后实现
    请教在 shell 上批量修改文件名如何编写脚本

    原文件名:123456789-XXXXXXXX.zzzz

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

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

    匹配所有文件,拿到数值开头的$1 以及.xxx 结尾的 xxx $2,重命名为$1.$2, 试了你给的文件没问题,再跑不起来就母鸡了。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   958 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 21:40 · PVG 05:40 · LAX 14:40 · JFK 17:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.