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

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

  •  
  •   kaminic · 2017-06-16 00:52:22 +08:00 · 3175 次点击
    这是一个创建于 2478 天前的主题,其中的信息可能已经有所发展或是发生改变。
    原始文件名如:
    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   ·   我们的愿景   ·   实用小工具   ·   5296 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 09:05 · PVG 17:05 · LAX 02:05 · JFK 05:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.