AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1501336
Accepted
DealTime444
DealTime444
Asked: 2024-01-26 07:30:58 +0800 CST2024-01-26 07:30:58 +0800 CST 2024-01-26 07:30:58 +0800 CST

对连续文件列表重新编号,同时保留文件名的其余部分

  • 772

我有一个系列不按季节编号,而是按从 0 到 150 左右的绝对顺序编号。我想按季节对这些文件重新编号,以便在 Plex 中正确拾取它们。以下是“Season 2”文件夹当前的示例(前 5 个文件):

'Show Name - 014 Episode Title 1 [480p] [x265].mkv'
'Show Name - 015 Episode Title 2 [480p] [x265].mkv'
'Show Name - 016 Episode Title 3 [480p] [x265].mkv'
'Show Name - 017 Episode Title 4 [480p] [x265].mkv'
'Show Name - 018 Episode Title 5 [480p] [x265].mkv'

等等。

正如您所看到的,赛季开始编号为 14,而不是 1。首先,我使用 Nautilus 的重命名工具将 替换- 0为S02E。现在看起来是这样的:

anon@anonpc:~/Downloads/sandbox$ ls
'Show Name S02E14 Episode Title 1 [480p] [x265].mkv'
'Show Name S02E15 Episode Title 2 [480p] [x265].mkv'
'Show Name S02E16 Episode Title 3 [480p] [x265].mkv'
'Show Name S02E17 Episode Title 4 [480p] [x265].mkv'
'Show Name S02E18 Episode Title 5 [480p] [x265].mkv'

但我需要以 01 开头的剧集编号。这是我想出的最接近的:

for i in {14..18}; do mv Show\ Name\ S02E$i*.mkv Show\ Name\ S02E$((i-13))*; done

但这不能正常工作:

mv: target 'Show Name S02E18 Episode Title 5 [480p] [x265].mkv' is not a directory

现在看起来像这样:

anon@anonpc:~/Downloads/sandbox$ ls
'Show Name S02E14 Episode Title 1 [480p] [x265].mkv'
'Show Name S02E2*'
'Show Name S02E3*'
'Show Name S02E4*'
'Show Name S02E5*'

您可以看到第一个通配符*可用于获取完整的文件名,但在对mv文件重新编号时不会考虑其余的通配符。另外,我不知道为什么列表中的第一项没有被重命名。

我想知道如何以上述方式对文件重新编号,同时保留整数两侧的原始文件名。我使用 Ubuntu 22.04 和默认的 bash shell。谢谢

command-line
  • 2 2 个回答
  • 292 Views

2 个回答

  • Voted
  1. Best Answer
    Daniel T
    2024-01-26T08:12:22+08:002024-01-26T08:12:22+08:00

    Bash 全局匹配仅适用于现有文件。在这种情况下,您可以只使用 Bash 前缀删除 ( ${variable#prefix_to_remove}) 来指定您想要的重命名目的地:

    prefix=Show\ Name\ S02E
    for i in {14..18}; do
      x=("$prefix"$i*.mkv) # Use glob to find the original file with the title
      y="${x#*S02}" # Remove the constant show name part
      y="${y#* }" # Remove the variably unknown part by removing up to the next space
      mv "$x" "$prefix$((i-13)) $y" # Compose the destination
    done
    

    测试运行:

    home@daniel-tablet1:~/tmp$ ll
    .rw-rw-r-- 0 home 25 Jan 18:57 'Show Name S02E14 Episode Title 1 [480p] [x265].mkv'
    .rw-rw-r-- 0 home 25 Jan 18:57 'Show Name S02E15 Episode Title 2 [480p] [x265].mkv'
    .rw-rw-r-- 0 home 25 Jan 18:57 'Show Name S02E16 Episode Title 3 [480p] [x265].mkv'
    .rw-rw-r-- 0 home 25 Jan 18:57 'Show Name S02E17 Episode Title 4 [480p] [x265].mkv'
    .rw-rw-r-- 0 home 25 Jan 18:57 'Show Name S02E18 Episode Title 5 [480p] [x265].mkv'
    home@daniel-tablet1:~/tmp$ prefix=Show\ Name\ S02E; for i in {14..18}; do x=("$prefix"$i*.mkv); y="${x#*S02}"; y="${y#* }"; mv "$x" "$prefix$((i-13)) $y"; done
    home@daniel-tablet1:~/tmp$ ll
    .rw-rw-r-- 0 home 25 Jan 18:57 'Show Name S02E1 Episode Title 1 [480p] [x265].mkv'
    .rw-rw-r-- 0 home 25 Jan 18:57 'Show Name S02E2 Episode Title 2 [480p] [x265].mkv'
    .rw-rw-r-- 0 home 25 Jan 18:57 'Show Name S02E3 Episode Title 3 [480p] [x265].mkv'
    .rw-rw-r-- 0 home 25 Jan 18:57 'Show Name S02E4 Episode Title 4 [480p] [x265].mkv'
    .rw-rw-r-- 0 home 25 Jan 18:57 'Show Name S02E5 Episode Title 5 [480p] [x265].mkv'
    
    • 3
  2. Raffa
    2024-01-26T15:41:40+08:002024-01-26T15:41:40+08:00

    您可以使用 GNUsort或 GNU中的版本控制排序选项ls,如下rename所示:

    printf '%s\n' * | sort -V | rename -v -n 'our $i; ++$i; s/([^\d]+)([\d]+)([^\d]+)([\d]+)([^\d]+)([\d]+)(.*\.mkv)/$1$2$3$i$5$6$7/'
    

    ... 或者:

    ls -v | rename -v -n 'our $i; ++$i; s/([^\d]+)([\d]+)([^\d]+)([\d]+)([^\d]+)([\d]+)(.*\.mkv$)/$1$2$3$i$5$6$7/'
    

    ([^\d]+)是非数字的捕获组,([\d]+)仅适用于数字$1,$2, , $3... 等是它们的参考数字...您可能需要根据文件名中的字符模式调整这些数字。

    请注意,如果您的文件名中包含换行符,这些操作将会失败。

    -n的选项用于rename空运行模式(文件系统上不会发生实际的文件重命名)...因此,尝试这些,如果您同意输出,则再次重新运行,而不需要像这样的演示的-n选项:rename

    $ ls -v | rename -v -n 'our $i; ++$i; s/([^\d]+)([\d]+)([^\d]+)([\d]+)([^\d]+)([\d]+)(.*\.mkv)/$1$2$3$i$5$6$7/'
    Reading filenames from file handle (GLOB(0x559cb54612b0))
    rename(Show Name S02E9 Episode Title 1 [480p] [x265].mkv, Show Name S02E1 Episode Title 1 [480p] [x265].mkv)
    rename(Show Name S02E10 Episode Title 2 [480p] [x265].mkv, Show Name S02E2 Episode Title 2 [480p] [x265].mkv)
    rename(Show Name S02E11 Episode Title 3 [480p] [x265].mkv, Show Name S02E3 Episode Title 3 [480p] [x265].mkv)
    rename(Show Name S02E12 Episode Title 4 [480p] [x265].mkv, Show Name S02E4 Episode Title 4 [480p] [x265].mkv)
    rename(Show Name S02E16 Episode Title 5 [480p] [x265].mkv, Show Name S02E5 Episode Title 5 [480p] [x265].mkv)
    rename(Show Name S02E17 Episode Title 6 [480p] [x265].mkv, Show Name S02E6 Episode Title 6 [480p] [x265].mkv)
    rename(Show Name S02E20 Episode Title 7 [480p] [x265].mkv, Show Name S02E7 Episode Title 7 [480p] [x265].mkv)
    rename(Show Name S02E21 Episode Title 8 [480p] [x265].mkv, Show Name S02E8 Episode Title 8 [480p] [x265].mkv)
    rename(Show Name S02E50 Episode Title 9 [480p] [x265].mkv, Show Name S02E9 Episode Title 9 [480p] [x265].mkv)
    rename(Show Name S02E100 Episode Title 10 [480p] [x265].mkv, Show Name S02E10 Episode Title 10 [480p] [x265].mkv)
    $
    $
    $ ls -l
    total 0
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:12 'Show Name S02E100 Episode Title 10 [480p] [x265].mkv'
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:10 'Show Name S02E10 Episode Title 2 [480p] [x265].mkv'
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:10 'Show Name S02E11 Episode Title 3 [480p] [x265].mkv'
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:10 'Show Name S02E12 Episode Title 4 [480p] [x265].mkv'
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:10 'Show Name S02E16 Episode Title 5 [480p] [x265].mkv'
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:11 'Show Name S02E17 Episode Title 6 [480p] [x265].mkv'
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:11 'Show Name S02E20 Episode Title 7 [480p] [x265].mkv'
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:11 'Show Name S02E21 Episode Title 8 [480p] [x265].mkv'
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:12 'Show Name S02E50 Episode Title 9 [480p] [x265].mkv'
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:10 'Show Name S02E9 Episode Title 1 [480p] [x265].mkv'
    $
    $
    $ ls -v | rename -v 'our $i; ++$i; s/([^\d]+)([\d]+)([^\d]+)([\d]+)([^\d]+)([\d]+)(.*\.mkv$)/$1$2$3$i$5$6$7/'
    Reading filenames from file handle (GLOB(0x55d02a78c0a0))
    Show Name S02E9 Episode Title 1 [480p] [x265].mkv renamed as Show Name S02E1 Episode Title 1 [480p] [x265].mkv
    Show Name S02E10 Episode Title 2 [480p] [x265].mkv renamed as Show Name S02E2 Episode Title 2 [480p] [x265].mkv
    Show Name S02E11 Episode Title 3 [480p] [x265].mkv renamed as Show Name S02E3 Episode Title 3 [480p] [x265].mkv
    Show Name S02E12 Episode Title 4 [480p] [x265].mkv renamed as Show Name S02E4 Episode Title 4 [480p] [x265].mkv
    Show Name S02E16 Episode Title 5 [480p] [x265].mkv renamed as Show Name S02E5 Episode Title 5 [480p] [x265].mkv
    Show Name S02E17 Episode Title 6 [480p] [x265].mkv renamed as Show Name S02E6 Episode Title 6 [480p] [x265].mkv
    Show Name S02E20 Episode Title 7 [480p] [x265].mkv renamed as Show Name S02E7 Episode Title 7 [480p] [x265].mkv
    Show Name S02E21 Episode Title 8 [480p] [x265].mkv renamed as Show Name S02E8 Episode Title 8 [480p] [x265].mkv
    Show Name S02E50 Episode Title 9 [480p] [x265].mkv renamed as Show Name S02E9 Episode Title 9 [480p] [x265].mkv
    Show Name S02E100 Episode Title 10 [480p] [x265].mkv renamed as Show Name S02E10 Episode Title 10 [480p] [x265].mkv
    $
    $
    $ ls -l
    total 0
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:12 'Show Name S02E10 Episode Title 10 [480p] [x265].mkv'
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:10 'Show Name S02E1 Episode Title 1 [480p] [x265].mkv'
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:10 'Show Name S02E2 Episode Title 2 [480p] [x265].mkv'
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:10 'Show Name S02E3 Episode Title 3 [480p] [x265].mkv'
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:10 'Show Name S02E4 Episode Title 4 [480p] [x265].mkv'
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:10 'Show Name S02E5 Episode Title 5 [480p] [x265].mkv'
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:11 'Show Name S02E6 Episode Title 6 [480p] [x265].mkv'
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:11 'Show Name S02E7 Episode Title 7 [480p] [x265].mkv'
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:11 'Show Name S02E8 Episode Title 8 [480p] [x265].mkv'
    -rw-rw-r-- 1 ubuntu ubuntu 0 يناير  26 10:12 'Show Name S02E9 Episode Title 9 [480p] [x265].mkv'
    

    这样做的好处是可以自动处理任何任意/变化的编号序列,并且仍然将它们重命名为从原始排序状态开始1并基于其原始排序状态的顺序编号。

    • 2

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve