怎么使用脚本批量重命名这类文件名 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
kaminic
V2EX    Linux

怎么使用脚本批量重命名这类文件名

  •  
  •   kaminic 2017-06-16 00:52:22 +08:00 3766 次点击
    这是一个创建于 3039 天前的主题,其中的信息可能已经有所发展或是发生改变。
    原始文件名如:
    S01E01.Pilot.ass
    S01E01.Pilot.mkv
    S01E02.The.Big.Bran.Hypothesis.ass
    S01E02.The.Big.Bran.Hypothesis.mkv
    S01E03.The.Fuzzy.Boots.Corollary.ass
    S01E03.The.Fuzzy.Boots.Corollary.mkv
    S01E04.The.Luminous.Fish.Effect.ass
    S01E04.The.Luminous.Fish.Effect.mkv
    S01E05.The.Hamburger.Postulate.ass
    S01E05.The.Hamburger.Postulate.mkv

    重命名成下面这种格式:
    The Big Bang Theory - S01E12 - Pilot.mkv
    或者:
    The Big Bang Theory - S01E12.mkv

    是的没错,为了在 Plex 中能自动识别封面
    /TV Shows
    /Grey's Anatomy
    /Season 01
    Grey's Anatomy - s01e01.avi
    Grey's Anatomy - s01e02 - The First Cut is the Deepest.avi
    Grey's Anatomy - s01e03.mp4
    /Season 02
    Grey's Anatomy - s02e01.avi
    Grey's Anatomy - s02e02.mkv
    Grey's Anatomy - s02e03.m4v

    除了编程,想了好久也不知道怎么使用几行脚本解决...
    第 1 条附言    2017-06-16 10:54:06 +08:00
    重新学习了下 awk 原来也可以实现

    ls |awk -F. '{t=""; for(i=2;i<NF;i++) t = $i "." t; printf("mv %s \"The Big Bang Theory - %s - %s%s\"\n", $0, $1,t,$NF) }'

    mv S01E01.Pilot.ass "The Big Bang Theory - S01E01 - Pilot.ass"
    mv S01E01.Pilot.mkv "The Big Bang Theory - S01E01 - Pilot.mkv"
    mv S01E02.The.Big.Bran.Hypothesis.ass "The Big Bang Theory - S01E02 - Hypothesis.Bran.Big.The.ass"
    mv S01E02.The.Big.Bran.Hypothesis.mkv "The Big Bang Theory - S01E02 - Hypothesis.Bran.Big.The.mkv"
    mv S01E03.The.Fuzzy.Boots.Corollary.ass "The Big Bang Theory - S01E03 - Corollary.Boots.Fuzzy.The.ass"
    mv S01E03.The.Fuzzy.Boots.Corollary.mkv "The Big Bang Theory - S01E03 - Corollary.Boots.Fuzzy.The.mkv"
    mv S01E04.The.Luminous.Fish.Effect.ass "The Big Bang Theory - S01E04 - Effect.Fish.Luminous.The.ass"
    16 条回复    2017-06-22 20:49:07 +08:00
    privil
        1
    privil  
       2017-06-16 00:58:39 +08:00
    或者的那个比较简单,文件名切分 awk 处理出来新文件名,然后 mv 一下就好了
    想了下,几行搞定了
    AX5N
        2
    AX5N  
       2017-06-16 01:02:18 +08:00
    有现成带 gui 的工具,为什么一定要用脚本呢.....
    ETiV
        3
    ETiV  
       2017-06-16 01:19:45 +08:00   1
    for n in *.mkv; do e=$(echo $n | awk -F. '{print $1}'); d=$(printf "The Big Bang Theory - %s.mkv" $e); mv "$n" "$d"; done
    kaminic
        4
    kaminic  
    OP
       2017-06-16 01:48:23 +08:00
    @AX5N 因为是在一台无显示器的服务器里
    geelaw
        5
    geelaw  
       2017-06-16 01:54:39 +08:00
    ```powershell
    $regex = [regex]::new('^(.*?)\.(.*)\.(.*?)$')
    Get-ChildItem | ForEach-Object {
    $match = $regex.Match($_.Name);
    $_ | Rename-Item -NewName "The Big Bang Theory - $($match.Groups[1].Value) - $($match.Groups[2].Value.Replace('.', ' ')).$($match.Groups[3].Value)"
    }
    ```
    popkara
        6
    popkara  
       2017-06-16 01:55:57 +08:00
    @kaminic 为什么工具一定要跑在服务器里呢?开个 SMB,在 PC 上改名不久行了?速度虽然慢点,但是我想你也没有那么多文件吧?
    kaminic
        7
    kaminic  
    OP
       2017-06-16 01:57:08 +08:00
    @popkara 有更好的解决方法为啥要这么折腾呢
    AX5N
        8
    AX5N  
       2017-06-16 02:47:41 +08:00
    @kaminic 说真的,我觉得普通脚本语言解决不了这个问题,因为这个问题最大的坑在于排序问题,万一脚本是个二逼排序,你的东西就全乱了。你不用 gui,很多坑可能你预计不到。
    AX5N
        9
    AX5N  
       2017-06-16 02:49:24 +08:00
    @kaminic 推荐你用 gui 最大的好处就是能避免出现排序问题,例如你下载的电视剧种子里,同时存在 v1 版本和 v2 版本怎么办?
    PythonAnswer
        10
    PythonAnswer  
       2017-06-16 06:59:40 +08:00 via Android
    totalcmd 自带此功能吧

    或者自己写个正则
    schezukNewTos
        11
    schezukNewTos  
       2017-06-16 08:01:05 +08:00
    rename Perl 版本支持正则,但是会**覆盖同名目标文件**,即使没有加-f 参数。下例将输出 1:
    ```echo 1 > test1 ; echo 2 > test2 ; rename s/test1/test2/ test1 ; cat test2```
    araraloren
        12
    araraloren  
       2017-06-16 09:26:48 +08:00   1
    看你的需求只能需要用正则匹配出来 替换就行了。。

    ```
    #!/usr/bin/perl6

    sub MAIN(*@files) {
    for @files -> $_ is copy {
    my $sn = $_;
    s/^
    (S\d+E\d+)
    \.
    ([ <-[\.]>+ ]+ % \.)
    \.
    (.*)
    $/$0 - {$_ = $1; tr/\./ /; $_}.$2/;
    my $status = rename($sn, $_);
    say "rename \[$status\]: {$sn} => {$_}";
    }
    }
    ```

    以下是效果,你的 The Big Bang Theory 我没加,不知道这是不是符合你的要求。。
    $ ./rename.p6 *.ass *.mkv
    rename [True]: S01E01.Pilot.ass => S01E01 - Pilot.ass
    rename [True]: S01E02.The.Big.Bran.Hypothesis.ass => S01E02 - The Big Bran Hypothesis.ass
    rename [True]: S01E03.The.Fuzzy.Boots.Corollary.ass => S01E03 - The Fuzzy Boots Corollary.ass
    rename [True]: S01E04.The.Luminous.Fish.Effect.ass => S01E04 - The Luminous Fish Effect.ass
    rename [True]: S01E05.The.Hamburger.Postulate.ass => S01E05 - The Hamburger Postulate.ass
    rename [True]: S01E01.Pilot.mkv => S01E01 - Pilot.mkv
    rename [True]: S01E02.The.Big.Bran.Hypothesis.mkv => S01E02 - The Big Bran Hypothesis.mkv
    rename [True]: S01E03.The.Fuzzy.Boots.Corollary.mkv => S01E03 - The Fuzzy Boots Corollary.mkv
    rename [True]: S01E04.The.Luminous.Fish.Effect.mkv => S01E04 - The Luminous Fish Effect.mkv
    rename [True]: S01E05.The.Hamburger.Postulate.mkv => S01E05 - The Hamburger Postulate.mkv
    loryyang
        13
    loryyang  
       2017-06-16 13:53:46 +08:00
    提个醒,不要因为 bug,导致目标文件都变成一样的。。。到时候欲哭无泪
    kaminic
        14
    kaminic  
    OP
       2017-06-16 16:17:20 +08:00
    @loryyang 听起来好像有个故事
    uuspider
        15
    uuspider  
       2017-06-16 18:08:12 +08:00
    上古神器 awk 就是为此而生啊
    flynaj
        16
    flynaj  
       2017-06-22 20:49:07 +08:00
    文件少最简单还是 totalcmd
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5848 人在线   最高记录 6679       Select Language
    创工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 06:35 PVG 14:35 LAX 23:35 JFK 02:35
    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