文件名字中各种奇葩字符怎么批量去除呢 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
liangzi
V2EX    Linux

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

  •   liangzi 2018-09-07 09:17:56 +08:00 6153 次点击
    这是一个创建于 2594 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 门罗音乐的文件 自己把 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     Solana     5975 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 41ms UTC 01:42 PVG 09:42 LAX 18:42 JFK 21:42
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86