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

文件名字中各种奇葩字符怎么批量去除呢

  •  
  •   liangzi · 2018-09-07 09:17:56 +08:00 · 5654 次点击
    这是一个创建于 2273 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 门罗音乐的文件 自己把 rar 文件名字中奇葩的字符去掉了一部分 批量解压开了
    • 解压得到的文件名字是目录 里面含有文件 一个或者多个文件
    • 部分目录名字如下
    [87].Hemi-Sync.-.Human Plus.-.Do This Now
    [88].Hemi-Sync.-.Human Plus.-.Eat-No Eat
    [89].Hemi-Sync.-.Human Plus.-.Eight Great
    [90].Hemi-Sync.-.Human Plus.-.Hypertension
    [91].Hemi-Sync.-.Human Plus.-.Immunizing
    [92].Hemi-Sync.-.Human Plus.-.Imprint
    [93.Update].Hemi-Sync.-.Human Plus.-.Let-Go
    [94].Hemi-Sync.-.Human Plus.-.Lungs Repairs and Maintenance
    [95].Hemi-Sync.-.Human Plus.-.Mobius West
    [96].Hemi-Sync.-.Human Plus.-.Nutricia
    [97].Hemi-Sync.-.Human Plus.-.Off-Loading
    [98].Hemi-Sync.-.Human Plus.-.Pain Control
    [130].Hemi-Sync.-.MindFood.-.Soft and Still
    [131].Hemi-Sync.-.MindFood.-.The ''SO'' Chord
    [132].Hemi-Sync.-.MindFood.-.The Way of Hemi-Sync
    [133].Hemi-Sync.-.Explore the Original.-.Beyond the Golden Light
    [134].Hemi-Sync.-.Explore the Original.-.Connecting With Your Inner Guides
    [135].Hemi-Sync.-.Explore the Original.-.Golden Mind
    [136].Hemi-Sync.-.Explore the Original.-.Healing Journeys Support
    [137].Hemi-Sync.-.Explore the Original.-.Inner States Dawning of Awareness
    137Hemi-Sync.-.Explore the Original.-.Inner States Dawning of Awareness 内在意识的曙光
    [138].Hemi-Sync.-.Explore the Original.-.The Music of Graceful Passages
    
    
    • 这里的.-.用了转义字符都无法搞定
    • 下面是我使用的方法
    ## 去掉改文件名开头的 “\[”
    for file in ls \[*;
    do
    mv $file `echo $file | sed 's/\[//g'`;
    done
    
    ## 去掉文件名字开头的“〖”
    for file in ls 〖*;
    do
    mv $file `echo $file | sed 's/〖//g'`
    done
    
    #--------------
    ##去掉文件名中间的 "]"
    for file in `ls | grep "]"`;
    do
    mv $file `echo $file | sed 's/]//g'`;
    done
    
    ##去掉文件名字中间的“〗”
    for file in `ls | grep "〗"`
    do
    mv $file `echo $file | sed 's/〗//g'`
    done
    
    ## 去掉文件名字中间的“."
    for file in `ls | grep "\."`
    do
    mv $file `echo $file | sed 's/\./-/g'`
    done
    
    ##改-rar 为.rar
    for file in `ls | grep "\-rar"`
    do
    mv $file `echo $file | sed 's/\-rar/.rar/g'`
    done
    
    ##去掉文件名字中的“专辑名称:”
    for file in `ls | grep "专辑名称:"`
    do
    mv $file `echo $file | sed 's/专辑名称://g'`
    done
    
    ##去掉文件名字中的“:门罗研究所最广受欢迎的系列:”
    for file in `ls | grep ":门罗研究所最广受欢迎的系列:"`
    do
    mv $file `echo $file | sed 's/:门罗研究所最广受欢迎的系列://g'`
    done
    
    ## 批量解压 rar 到各自目录
    for i in ls *.rar;
    do
    rar x $i
    done
    
    45 条回复    2018-09-08 21:20:11 +08:00
    joke392
        1
    joke392  
       2018-09-07 09:37:03 +08:00
    不想写脚本的话,可以试试看这个小软件:RegexRenamer
    momocraft
        2
    momocraft  
       2018-09-07 09:46:29 +08:00
    用 bash 做这个要正确地搞定各种 blob 和数层 escape,考虑别的语言吧..
    momocraft
        3
    momocraft  
       2018-09-07 09:46:44 +08:00
    *各种 glob
    holmesabc
        4
    holmesabc  
       2018-09-07 09:49:15 +08:00
    直接 rename 命令吧
    liangzi
        5
    liangzi  
    OP
       2018-09-07 09:51:59 +08:00 via Android
    @holmesabc 我的发行版 rename 还很奇葩 是个 gui 界面的试了一下还不行。。。
    liangzi
        6
    liangzi  
    OP
       2018-09-07 09:52:15 +08:00 via Android
    @joke392 谢谢 回去试试
    liangzi
        7
    liangzi  
    OP
       2018-09-07 09:52:24 +08:00 via Android
    @momocraft 好的 谢谢
    mwwfer
        8
    mwwfer  
       2018-09-07 09:58:11 +08:00
    试下 Total Commander 批量重命名,文件名在 Sublime Text 或者 VS Code 里面批量处理一下,1 分钟搞定。
    iwtbauh
        9
    iwtbauh  
       2018-09-07 10:23:05 +08:00 via Android
    mv $file 改为 mv "$file"
    omph
        10
    omph  
       2018-09-07 10:36:16 +08:00   ❤️ 1
    安装 renameutils,使用 qmv
    zhouzm
        11
    zhouzm  
       2018-09-07 11:00:42 +08:00   ❤️ 1
    用 vim 可以随心欲的改。

    http://vim.wikia.com/wiki/Bulk_rename_files_with_Vim

    vim 的正则: http://vimregex.com/

    例如匹配 行首大括号部分::/\[\d\+\.*.\+\],至于匹配 .-. 更容易了 :/\.-\.

    替换使用 :%s,:%s/\[\d\+\.*.\+\]//gc,无需确认的话,去掉 c
    sunznx
        12
    sunznx  
       2018-09-07 11:02:21 +08:00
    这种有规律的,一般都是用 emacs 的 dired 解决
    liangzi
        13
    liangzi  
    OP
       2018-09-07 11:08:09 +08:00
    @omph openSUSE15.0 官方没有这个包 只有 42.3 个人打包的一个。。。
    liangzi
        14
    liangzi  
    OP
       2018-09-07 11:08:59 +08:00
    @iwtbauh 试了 不行 里面的奇葩字符太多无法实现
    liangzi
        15
    liangzi  
    OP
       2018-09-07 11:10:13 +08:00
    @zhouzm 这里的文件名字都是目录 不是单纯的单个 如果是单个文件的话用 kate 就能搞定了
    liangzi
        16
    liangzi  
    OP
       2018-09-07 11:11:03 +08:00
    @sunznx 没玩过 emacs。。。。。
    Aprilming
        17
    Aprilming  
       2018-09-07 11:25:46 +08:00
    好头像,我还有个 blackbetty passport 呢。看到这个标志,真情怀啊、
    redsonic
        18
    redsonic  
       2018-09-07 11:28:29 +08:00   ❤️ 1
    ls -i
    找到文件对应的 inode number
    然后
    find -inum 刚才找到的 inodenum -exec mv '{}' '新文件名' \;
    liangzi
        19
    liangzi  
    OP
       2018-09-07 11:44:22 +08:00
    @redsonic 我的卖了。。。。
    liangzi
        20
    liangzi  
    OP
       2018-09-07 11:50:58 +08:00
    @redsonic 我试试 谢谢
    zhouzm
        21
    zhouzm  
       2018-09-07 12:01:31 +08:00   ❤️ 1
    @liangzi 你认真看过 Bulk_rename_files_with_Vim 这个链接了吗?

    第一步就是教怎么批量把文件或目录名导入 vim,然后是通过正则替换生成批量的 mv 命令,最后是执行。
    我没明白你说的单个文件是什么意思。
    liangzi
        22
    liangzi  
    OP
       2018-09-07 12:10:43 +08:00
    @zhouzm 我看看谢谢
    kokutou
        23
    kokutou  
       2018-09-07 12:15:07 +08:00
    1、批量替换 "." 为 " "
    2、批量替换 " - " 为 " "
    3、批量替换 " 扩展名" 为 ".扩展名"
    mingl0280
        24
    mingl0280  
       2018-09-07 12:26:08 +08:00
    1. (\.)?-(\.)? 替换为 -
    2. (\[)?(\d+)(\]|\.Update)?(\]|\.)? 保留第二组并加一个空格
    另外你给的文件名只能说明你的暴力替换完全没用……
    liangzi
        25
    liangzi  
    OP
       2018-09-07 12:46:50 +08:00
    弄好一部分了 谢谢各位的回答
    特别感谢
    @zhouzm
    @redsonic
    aaaaasam
        26
    aaaaasam  
       2018-09-07 14:29:44 +08:00   ❤️ 1
    cat ~/下载 /name | while read line; do echo $line | sed -e 's/[.|-]/ /g' -e 's/\[/ /' -e 's/\]/ /' ; done
    liangzi
        27
    liangzi  
    OP
       2018-09-07 15:12:22 +08:00
    @aaaaasam 刚弄好了 谢谢你
    Lostars
        28
    Lostars  
       2018-09-07 16:18:55 +08:00
    cat name | sed 's/\[//g' | sed 's/\]//' | sed "s/[.-]//g"

    01HemiSyncMetaMusicAngel Paradise 天使乐园
    02HemiSyncMetaMusicAscension 耶稣升天
    03HemiSyncMetaMusicBaroque Garden
    04HemiSyncMetaMusicBetween Worlds
    05HemiSyncMetaMusicBreakthrough for peakperformance
    06HemiSyncMetaMusicChakra Journey
    07HemiSyncMetaMusicCloudscapes
    08HemiSyncMetaMusicConvergence

    不知道是不是要这样的效果
    xiaq
        29
    xiaq  
       2018-09-07 16:45:25 +08:00 via iPad
    mv $file "$(echo $file | tr -d '[]-.')"
    liangzi
        30
    liangzi  
    OP
       2018-09-07 17:53:10 +08:00 via Android
    @Lostars 是的 请问你是哪种方法实现的?
    Lostars
        31
    Lostars  
       2018-09-07 19:32:59 +08:00
    @liangzi
    cat name | sed 's/\[//g' | sed 's/\]//' | sed "s/[.-]//g"
    Tumblr
        32
    Tumblr  
       2018-09-07 20:11:47 +08:00
    感觉直接替换掉就 OK 吧? 替换之后简单看了下,和 #28 楼的好像是一样的。

    在 vim 中 `:%s/[\[\]\.-]//g`

    或者如果用的是 PowerShell: `(gc name.txt -Encoding Default) -replace "[\[\]\.-]",""`
    wweir
        33
    wweir  
       2018-09-07 20:45:06 +08:00 via Android   ❤️ 1
    ls | xargs awk '{printf("mv %s `echo %s \ sed -E s/[^0-9A-Za-z]//g`",$1,$1)}' | sh
    手机码字,自行调试
    user002
        34
    user002  
       2018-09-07 21:27:10 +08:00 via Android   ❤️ 1
    从后往前匹配
    user002
        35
    user002  
       2018-09-07 21:32:29 +08:00 via Android
    学习学习
    ETiV
        36
    ETiV  
       2018-09-07 21:50:49 +08:00   ❤️ 1
    ls \[* | while read line ; do new_name=$(echo "${line}" | sed 's!\[!!g' | sed 's!\]!!g' | sed 's!\.-\.!_!g') ; mv "${line}" "${new_name}" ; done

    ls [ 开头的文件,会产生每行一个文件名
    循环每行的文件名:
    3 个 sed 分别移除 [、移除 ]、替换 .-. 成 _,形成新的 name
    然后 mv 老文件名 新文件名
    liangzi
        37
    liangzi  
    OP
       2018-09-07 22:00:44 +08:00
    @ETiV 实际上不行 谢谢回复
    ETiV
        38
    ETiV  
       2018-09-07 22:06:20 +08:00
    @liangzi 可是,我都已经跑完了啊…😂
    liangzi
        39
    liangzi  
    OP
       2018-09-07 22:10:31 +08:00
    - 感谢大家热心的帮助
    - 原文件名字上传到了这里[https://transfer.sh/14gOEi/menluo_music_directory-txt]( https://transfer.sh/14gOEi/menluo_music_directory-txt0 有效期 14 天
    - 这是压缩文件 要做的目的就是批量解压然后把解压的文件批量重新命名 以实现文件名字中没有奇葩字符
    - 我是个这方面的外行 用到的方法也都是从网上搜出来比猫画虎的试着做
    - 目前从 @zhouzm @redsonic 两位提供的方法中自己慢慢摸索着实现了个差不多 特别感谢~ ^_^
    - 最后的目录是这样的[https://transfer.sh/WzeMa/remenlu_music]( https://transfer.sh/WzeMa/remenlu_music)
    ps1aniuge
        40
    ps1aniuge  
       2018-09-08 01:08:33 +08:00   ❤️ 1
    #win,linux 通用的 powershell 代码
    dir 你的目录|foreach {
    $a = $_.name.
    Replace('.-.'.'').
    Replace('['.'').
    Replace(']'.'').
    Replace('〖'.'').
    Replace('〗'.'').
    Replace('.'.'').
    Replace('-rar'.'.rar').
    Replace('专辑名称:'.'').
    Replace(':门罗研究所最广受欢迎的系列:'.'')

    Rename-Item -LiteralPath $_.FullName -NewName $a
    }
    zhouzm
        41
    zhouzm  
       2018-09-08 09:55:08 +08:00
    @ps1aniuge
    替换在准确性上是不如正则匹配的,例如 [87] 和 [93.Update] 都是要删除的,还有"137Hemi-Sync"这里的 137,正则可以很一次匹配,简单替换则无法处理。

    尤其是楼主例子里的文件名其实是有规律的,写好正则后,可以整行一次性匹配。
    zyuhung
        42
    zyuhung  
       2018-09-08 11:00:19 +08:00
    复制到 word 文档,然后全选,表格→文字转换表格,文字分隔位置→其他字符
    ps1aniuge
        43
    ps1aniuge  
       2018-09-08 15:16:37 +08:00
    如果只改目录名。加上-Directory 如果含有子目录的话,就加上-Recurse

    41 楼:没看到楼主要求去掉数字,去掉数字也可以不用正则。
    ps1aniuge
        44
    ps1aniuge  
       2018-09-08 15:18:36 +08:00
    Replace('〖',''). 这里面的逗号,为啥贴上去后改变点了?
    liangzi
        45
    liangzi  
    OP
       2018-09-08 21:20:11 +08:00
    我发现我的发行版里面有个 krename 分分钟搞定文件目录和名字 还能递归命名目录下的名字....
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5791 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 01:38 · PVG 09:38 · LAX 17:38 · JFK 20:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.