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

2017-06-16 00:52:22 +08:00
 kaminic
原始文件名如:
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

除了编程,想了好久也不知道怎么使用几行脚本解决...
3204 次点击
所在节点    Linux
16 条回复
privil
2017-06-16 00:58:39 +08:00
或者的那个比较简单,文件名切分 awk 处理出来新文件名,然后 mv 一下就好了
想了下,几行搞定了
AX5N
2017-06-16 01:02:18 +08:00
有现成带 gui 的工具,为什么一定要用脚本呢.....
ETiV
2017-06-16 01:19:45 +08:00
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
2017-06-16 01:48:23 +08:00
@AX5N 因为是在一台无显示器的服务器里
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
2017-06-16 01:55:57 +08:00
@kaminic 为什么工具一定要跑在服务器里呢?开个 SMB,在 PC 上改名不久行了?速度虽然慢点,但是我想你也没有那么多文件吧?
kaminic
2017-06-16 01:57:08 +08:00
@popkara 有更好的解决方法为啥要这么折腾呢
AX5N
2017-06-16 02:47:41 +08:00
@kaminic 说真的,我觉得普通脚本语言解决不了这个问题,因为这个问题最大的坑在于排序问题,万一脚本是个二逼排序,你的东西就全乱了。你不用 gui,很多坑可能你预计不到。
AX5N
2017-06-16 02:49:24 +08:00
@kaminic 推荐你用 gui 最大的好处就是能避免出现排序问题,例如你下载的电视剧种子里,同时存在 v1 版本和 v2 版本怎么办?
PythonAnswer
2017-06-16 06:59:40 +08:00
totalcmd 自带此功能吧

或者自己写个正则
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
2017-06-16 09:26:48 +08:00
看你的需求只能需要用正则匹配出来 替换就行了。。

```
#!/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
2017-06-16 13:53:46 +08:00
提个醒,不要因为 bug,导致目标文件都变成一样的。。。到时候欲哭无泪
kaminic
2017-06-16 16:17:20 +08:00
@loryyang 听起来好像有个故事
uuspider
2017-06-16 18:08:12 +08:00
上古神器 awk 就是为此而生啊
flynaj
2017-06-22 20:49:07 +08:00
文件少最简单还是 totalcmd

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/368753

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX