使用脚本在linux上使用regex重命名文件

使用脚本在linux上使用regex重命名文件,regex,linux,bash,Regex,Linux,Bash,我想重命名以下文件。基本上提取年份左侧的单词,删除所有非字母数字字符并用空格替换,然后将年份放在右侧的括号中 Annabelle.2014.HC.HDRip.XViD.AC3-juggs[ETRG].avi Dracula Untold 2014 720p HDRip x264 AC3-JYK.mkv From.Paris.with.Love.2010.1080p.BluRay.x264.YIFY.mp4 Godzilla.2014.1080p.BluRay.x264.YIFY.mp4 If.I

我想重命名以下文件。基本上提取年份左侧的单词,删除所有非字母数字字符并用空格替换,然后将年份放在右侧的括号中

Annabelle.2014.HC.HDRip.XViD.AC3-juggs[ETRG].avi
Dracula Untold 2014 720p HDRip x264 AC3-JYK.mkv
From.Paris.with.Love.2010.1080p.BluRay.x264.YIFY.mp4
Godzilla.2014.1080p.BluRay.x264.YIFY.mp4
If.I.Stay.2014.1080p.BluRay.x264-SPARKS.mkv
Into.the.Storm.2014.1080p.BluRay.x264.YIFY.mp4
Jessabelle.2014.HDRip.XViD-juggs[ETRG].avi
Ouija.2014.1080p.HC.WEBRip.x264.AAC2.0-RARBG.mp4
Teenage Mutant Ninja Turtles (2014) 1080p Full HDRip x264 AC3 6Ch-CPG.mp4
The.Purge.Anarchy.2014.1080p.BluRay.x264.YIFY.mp4
Transformers.Age.of.Extinction.2014.1080p.BluRay.x264.YIFY.mp4
因此,输出应该如下所示:

Annabelle (2014).avi
Dracula Untold (2014).mkv
From Paris with Love (2010).mp4
Godzilla (2014).mp4
If I Stay (2014).mkv
Into the Storm (2014).mp4
Jessabelle (2014).avi
Ouija (2014).mp4
Teenage Mutant Ninja Turtles (2014).mp4
The Purge Anarchy (2014).mp4
Transformers Age of Extinction (2014).mp4
我通过榜样学习,我很难弄明白这一点。我想让你看看我试过什么,但太尴尬了。

怎么样

sed -r 'y/./ /; s/[()]//g; s/^([^0-9]+)([0-9]+).*\s([a-z0-9]+)$/\1(\2).\3/;' inputFile
输出为

Annabelle (2014).avi
Dracula Untold (2014).mkv
From Paris with Love (2010).mp4
Godzilla (2014).mp4
If I Stay (2014).mkv
Into the Storm (2014).mp4
Jessabelle (2014).avi
Ouija (2014).mp4
Teenage Mutant Ninja Turtles  (2014).mp4
The Purge Anarchy (2014).mp4
Transformers Age of Extinction (2014).mp4
用法

for file in *
do
   mv "$file" "$(echo "$file" | sed -r 'y/./ /; s/[()]//g; s/^([^0-9]+)([0-9]+).*\s([a-z0-9]+)$/\1(\2).\3/;')"
done
测试

$ ls
Annabelle.2014.HC.HDRip.XViD.AC3-juggs[ETRG].avi  From.Paris.with.Love.2010.1080p.BluRay.x264.YIFY.mp4  Godzilla.2014.1080p.BluRay.x264.YIFY.mp4
$ for file in *; do    mv $file "$(echo $file | s sed -r 'y/./ /; s/[()]//g; s/^([^0-9]+)([0-9]+).*\s([a-z0-9]+)$/\1(\2).\3/;' )" ; done
$ ls
Annabelle (2014).avi  From Paris with Love (2010).mp4  Godzilla (2014).mp4
怎么样

sed -r 'y/./ /; s/[()]//g; s/^([^0-9]+)([0-9]+).*\s([a-z0-9]+)$/\1(\2).\3/;' inputFile
输出为

Annabelle (2014).avi
Dracula Untold (2014).mkv
From Paris with Love (2010).mp4
Godzilla (2014).mp4
If I Stay (2014).mkv
Into the Storm (2014).mp4
Jessabelle (2014).avi
Ouija (2014).mp4
Teenage Mutant Ninja Turtles  (2014).mp4
The Purge Anarchy (2014).mp4
Transformers Age of Extinction (2014).mp4
用法

for file in *
do
   mv "$file" "$(echo "$file" | sed -r 'y/./ /; s/[()]//g; s/^([^0-9]+)([0-9]+).*\s([a-z0-9]+)$/\1(\2).\3/;')"
done
测试

$ ls
Annabelle.2014.HC.HDRip.XViD.AC3-juggs[ETRG].avi  From.Paris.with.Love.2010.1080p.BluRay.x264.YIFY.mp4  Godzilla.2014.1080p.BluRay.x264.YIFY.mp4
$ for file in *; do    mv $file "$(echo $file | s sed -r 'y/./ /; s/[()]//g; s/^([^0-9]+)([0-9]+).*\s([a-z0-9]+)$/\1(\2).\3/;' )" ; done
$ ls
Annabelle (2014).avi  From Paris with Love (2010).mp4  Godzilla (2014).mp4

在存储要重命名的文件的目录上,尝试下面的
rename
命令

rename 's/\b\d{4}\b\K.+(?=\.)//g;s/[^A-Za-z\d]+(?=.*?\.[^.]+$)/ /g;s/\b(\d{4})\./($1)./' *.*
示例:

$ ls
Annabelle.2014.HC.HDRip.XViD.AC3-juggs[ETRG].avi
Teenage Mutant Ninja Turtles (2014) 1080p Full HDRip x264 AC3 6Ch-CPG.mp4
Transformers.Age.of.Extinction.2014.1080p.BluRay.x264.YIFY.mp4
$ rename 's/\b\d{4}\b\K.+(?=\.)//g;s/[^A-Za-z\d]+(?=.*?\.[^.]+$)/ /g;s/\b(\d{4})\./($1)./' -vn *.*
Annabelle.2014.HC.HDRip.XViD.AC3-juggs[ETRG].avi renamed as Annabelle (2014).avi
Teenage Mutant Ninja Turtles (2014) 1080p Full HDRip x264 AC3 6Ch-CPG.mp4 renamed as Teenage Mutant Ninja Turtles (2014).mp4
Transformers.Age.of.Extinction.2014.1080p.BluRay.x264.YIFY.mp4 renamed as Transformers Age of Extinction (2014).mp4

在存储要重命名的文件的目录上,尝试下面的
rename
命令

rename 's/\b\d{4}\b\K.+(?=\.)//g;s/[^A-Za-z\d]+(?=.*?\.[^.]+$)/ /g;s/\b(\d{4})\./($1)./' *.*
示例:

$ ls
Annabelle.2014.HC.HDRip.XViD.AC3-juggs[ETRG].avi
Teenage Mutant Ninja Turtles (2014) 1080p Full HDRip x264 AC3 6Ch-CPG.mp4
Transformers.Age.of.Extinction.2014.1080p.BluRay.x264.YIFY.mp4
$ rename 's/\b\d{4}\b\K.+(?=\.)//g;s/[^A-Za-z\d]+(?=.*?\.[^.]+$)/ /g;s/\b(\d{4})\./($1)./' -vn *.*
Annabelle.2014.HC.HDRip.XViD.AC3-juggs[ETRG].avi renamed as Annabelle (2014).avi
Teenage Mutant Ninja Turtles (2014) 1080p Full HDRip x264 AC3 6Ch-CPG.mp4 renamed as Teenage Mutant Ninja Turtles (2014).mp4
Transformers.Age.of.Extinction.2014.1080p.BluRay.x264.YIFY.mp4 renamed as Transformers Age of Extinction (2014).mp4

我在perl程序中尝试了上面的代码

如有必要,利用它

   use warnings;
   use strict;    
    opendir(DIR, "$ARGV[0]");
    my @file = grep{/\.[^\.]+$/i} readdir(DIR);
    close(DIR);     

    foreach my $songs (@file){
        my $song = $songs;
        $song =~ s{((?:(?!(?:\()?[0-9]{4}(?:\))?).)*)(?:\()?(2[0-9]{3})(?:\))?(.*?)(\.[^\.]+)$}{$1 ($2)$4}igm;

        $song =~ s{((?:(?!(?:\()?[0-9]{4}(?:\))?).)*(?:\()?2[0-9]{3}(?:\))?)(\.[^\.]+)$}{
            my $songname = $1;
            my $songtype = $2;
            $songname =~ s{\.}{ }igm;
            qq($songname$songtype)
        }isgem;

        rename("$ARGV[0]\\$songs", "$ARGV[0]\\$song") || die ( "Error in renaming" );

    }   
输出:

Annabelle  (2014).avi
Dracula Untold  (2014).mkv
From Paris with Love  (2010).mp4
Godzilla  (2014).mp4
If I Stay  (2014).mkv
Into the Storm  (2014).mp4
Jessabelle  (2014).avi
Ouija  (2014).mp4
Teenage Mutant Ninja Turtles  (2014).mp4
The Purge Anarchy  (2014).mp4
Transformers Age of Extinction  (2014).mp4

我在perl程序中尝试了上面的代码

如有必要,利用它

   use warnings;
   use strict;    
    opendir(DIR, "$ARGV[0]");
    my @file = grep{/\.[^\.]+$/i} readdir(DIR);
    close(DIR);     

    foreach my $songs (@file){
        my $song = $songs;
        $song =~ s{((?:(?!(?:\()?[0-9]{4}(?:\))?).)*)(?:\()?(2[0-9]{3})(?:\))?(.*?)(\.[^\.]+)$}{$1 ($2)$4}igm;

        $song =~ s{((?:(?!(?:\()?[0-9]{4}(?:\))?).)*(?:\()?2[0-9]{3}(?:\))?)(\.[^\.]+)$}{
            my $songname = $1;
            my $songtype = $2;
            $songname =~ s{\.}{ }igm;
            qq($songname$songtype)
        }isgem;

        rename("$ARGV[0]\\$songs", "$ARGV[0]\\$song") || die ( "Error in renaming" );

    }   
输出:

Annabelle  (2014).avi
Dracula Untold  (2014).mkv
From Paris with Love  (2010).mp4
Godzilla  (2014).mp4
If I Stay  (2014).mkv
Into the Storm  (2014).mp4
Jessabelle  (2014).avi
Ouija  (2014).mp4
Teenage Mutant Ninja Turtles  (2014).mp4
The Purge Anarchy  (2014).mp4
Transformers Age of Extinction  (2014).mp4


如果输入为
Dracula Untald 2014 720p HDRip x264 2014 AC3-JYK.mkv
?@AvinashRaj Dracula Untald(2014)。mkv如果输入为
Dracula Untald 2014 720p HDRip x264 2014 AC3-JYK.mkv
?@AvinashRaj Dracula Untald(2014)。mkvow!太酷了!如何触发重命名?对于目录中的每个文件,我都会得到“mv:target`(2014)。mp4'不是一个目录”。它对除两个以外的所有文件都有效。“mv:target
Dracula Untald(2014)。mkv'不是目录mv:target
Ninja Turtles(2014)。mp4'不是目录”@DavidCuster edite更正这个问题的答案太棒了!最后一件事,我注意到文件“忍者神龟(2014).mp4”上有一个额外的空间。这能修好吗?哇!太酷了!如何触发重命名?对于目录中的每个文件,我都会得到“mv:target`(2014)。mp4'不是一个目录”。它对除两个以外的所有文件都有效。“mv:target
Dracula Untald(2014)。mkv'不是目录mv:target
Ninja Turtles(2014)。mp4'不是目录”@DavidCuster edite更正这个问题的答案太棒了!最后一件事,我注意到文件“忍者神龟(2014).mp4”上有一个额外的空间。这是可修复的吗?文件没有重命名。我在文件所在的目录中运行了它。我正在运行root,这是一个正在测试的VM。是否添加了
-vn
参数?控制台输出是什么?没有错误消息。例如,我执行ls,然后获取file1 file1,然后重命名s/\b\d{4}\b\K.+(?=\)//g;s/[^A-Za-z\d]+(?=..*.\.[^.]+$)//g;s/\b(\d{4})\./($1)。/'-vn*.*然后再次使用ls和同一个file1 file2。是否有人会发布拒绝投票的原因?@DavidCuster从命令中删除
-vn
参数。。我刚刚添加了它来说明重命名对这些类型的文件的作用。大多数
rename
命令不支持此功能。文件未重命名。我在文件所在的目录中运行了它。我正在运行root,这是一个正在测试的VM。是否添加了
-vn
参数?控制台输出是什么?没有错误消息。例如,我执行ls,然后获取file1 file1,然后重命名s/\b\d{4}\b\K.+(?=\)//g;s/[^A-Za-z\d]+(?=..*.\.[^.]+$)//g;s/\b(\d{4})\./($1)。/'-vn*.*然后再次使用ls和同一个file1 file2。是否有人会发布拒绝投票的原因?@DavidCuster从命令中删除
-vn
参数。。我刚刚添加了它来说明重命名对这些类型的文件的作用。大多数
rename
命令不支持此功能。我如何将其定向到文件夹?@David Custer您正从文件夹中获取此文件。您必须重命名同一文件夹或其他输出文件夹中的文件名。需要重命名同一文件夹中的文件。我已编辑了代码。请检查一下$ARGV[0]是歌曲目录。Lol我从未使用过perl(DIR,“$ARGV[0]”);这条路通向哪里?它会取代ARGV吗?我该如何将其定向到文件夹中?@David Custer您正从文件夹中获取此文件。您必须重命名同一文件夹或其他输出文件夹中的文件名。需要重命名同一文件夹中的文件。我已编辑了代码。请检查一下$ARGV[0]是歌曲目录。Lol我从未使用过perl(DIR,“$ARGV[0]”);这条路通向哪里?它会取代ARGV吗?