如何使用模式

时间:2016-04-28 18:36:00

标签: regex linux bash perl

我有一堆文件,如:

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之后的部分,而不是它之前 所以,请帮助

4 个答案:

答案 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