我有一堆文件,如:
bla.super.lol.S01E03.omg.bbq.mp4
bla.super.lol.S01E04.omg.bbq.mp4
bla.super.lol.s03e12.omg.bbq.mp4
我需要将它们全部重命名为:
s01e03.mp4
s01e04.mp4
s03e12.mp4
我尝试用for file in *; do mv $file ${file%%\.omg*}; done
做到这一点,但它只删除了S01E01之后的部分,而不是它之前
所以,请帮助
答案 0 :(得分:4)
很多Linux都提供了一个很好的命令行工具,名为rename
,可以使用Perl正则表达式:
rename 's/.*\.(\w+\d)\..*/$1.mp4/;y/A-Z/a-z/' *.mp4
答案 1 :(得分:2)
简单的Perl脚本尝试解析出情节信息,跳过无法找到它们的文件。
#!perl
use strict;
use warnings;
use File::Copy qw(move);
foreach my $file ( glob('*.mp4') ) {
my ($info) = $file =~ m/([sS]\d+[eE]\d+)/;
next unless $info;
my $new_filename = lc $info . ".mp4";
move $file, $new_filename
or die "$!";
}
答案 2 :(得分:1)
纯粹的Bash解决方案:
for f in *.mp4; do
IFS=. read -r _ _ _ s _ <<< "$f"
mv -- "$f" "${s,,}.mp4"
done
为了测试它,我创建了以下树:
tree
.
├── bla.super.lol.S01E03.omg.bbq.mp4
├── bla.super.lol.S01E04.omg.bbq.mp4
└── bla.super.lol.s03e12.omg.bbq.mp4
0 directories, 3 files
我们在printf
之前加mv
以确定更改:
mv -- bla.super.lol.S01E03.omg.bbq.mp4 s01e03.mp4
mv -- bla.super.lol.S01E04.omg.bbq.mp4 s01e04.mp4
mv -- bla.super.lol.s03e12.omg.bbq.mp4 s03e12.mp4
看起来不错。季节部分被提取,并按要求降低。
答案 3 :(得分:0)
如果您的文件名始终以点分隔,并且SExxEmm部分总是第4个,那么我将使用awk执行此操作:
for file in *; do
mv $file $(echo $file | awk -F. '{print $4 "." $NF}');
done
awk -F.
将文件名分开,然后打印第4个和最后一个字段。
进行&#34;干运行&#34; (即显示命令而不是执行它们),用echo
:
for file in *; do
echo mv $file $(echo $file | awk -F. '{print $4 "." $NF}');
done