Limpar nomes de arquivos usando dados de um arquivo de texto

2

Eu preciso limpar um monte de nomes de arquivos de pastas. Possivelmente, até mesmo os títulos dos arquivos também. Eu estava usando este script Perl para fazer isso , mas eu tive alguns problemas .

  1. Se o nome do arquivo já tiver parênteses por volta do ano, ele adicionará outro conjunto.
  2. Eu também gostaria de usar um arquivo de texto para remover "assinaturas" comuns em títulos, ex. %código%.

    Atualmente, o script substitui o This.Movie.Blah.(2012) [1080p] MP4 pelo espaço pretendido e adiciona . em todo o ano. Executando o script, o resultado seria (xxxx) .

Também gostaria de remover as "assinaturas" que correspondem a valores de arquivos de texto (alinhados, não CSV) do nome do arquivo, então This Movie Blah ((2012)) [1080p] MP4 retornaria This.Movie.Blah.(2012) [1080p] MP4

use warnings;
use strict;
use File::Copy;

my $oldname;

opendir(my $d, ".") or die $!;
while(readdir $d) {
    if (-d $_ and $_ ne "." and $_ ne "..")
    {
        $oldname = $_;
        $_ =~ s/\./ /g;
        $_ =~ s/(\d{4})/($1)/g;
        move($oldname,$_);
    }
    }
closedir $d;

Eu tinha acabado de começar a tentar aprender Perl hoje como uma das minhas primeiras linguagens de programação, então sou relativamente novo nessa linguagem.

    
por Cole Mackenzie 27.07.2013 / 05:53

1 resposta

0

Como uma questão de expressões regulares (procurar texto por padrões e fazer substituições com base nelas), isso não é difícil; Estou surpreso que não há respostas depois de 15 horas. Eu não sou tão experiente em Perl quanto gostaria, mas uma abordagem direta ao problema entre parênteses é simplesmente detectá-lo depois e corrigi-lo:

        $_ =~ s/(\d{4})/($1)/g;
        $_ =~ s/(\((\d{4})\))/$1/g;

A segunda instrução procura ((2012)) e retorna os seis caracteres intermediários; isto é, o (2012) . Quanto às "assinaturas comuns", que tal

        $_ =~ s/ \[1080p\] MP4$//;

(Use \[ e \] para evitar que […] seja interpretado como um intervalo e $ para se referir ao final da string.

    
por 27.07.2013 / 21:52