Script para limpar nomes de pastas

Script para limpar nomes de pastas

Tenho muitas pastas que precisam ser renomeadas com base em algumas regras. exemplo de pastas:

-- Some.Folder.Name.Today.2009
-- Another.messed.Up.folder.1980
-- Third.messed.Up.folder.1980

Gostaria de ver se alguém tem um script rápido para renomear cada pasta para remover o ponto (.) do nome da pasta e também colocar parênteses em torno do ano para que fique assim

-- Some Folder Name Today (2009)
-- Another messed Up folder (1980)
-- Third messed Up folder (1980)

Muito obrigado!

Responder1

Perllida bem com isso, algo como isto deve ser suficiente:

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;

Testado apenas brevemente, sinta-se à vontade para jogar golfe/modificá-lo! Não é perfeito de forma alguma. Hackeamos tudo rapidamente ;)

Observação:Em seu estado atual, ele deve ser executado dentro do diretório com os nomes das pastas mutilados.

C:\Users\John\Desktop\folders>dir
 O volume na unidade C não tem rótulo.
 O número de série do volume é 8888-1666

 Diretório de C:\Users\John\Desktop\folders

29/01/2011 19h14 .
29/01/2011 19h14 ..
29/01/2011 19h07 algum.nome.da.pasta.2008
29/01/2011 19h07 algum.nome.da.pasta.2009
29/01/2011 19h16 282 ren.pl
               1 Arquivo(s) 282 bytes
               4 diretório(s) 53.349.425.152 bytes livres

C:\Users\John\Desktop\folders>ren.pl

C:\Users\John\Desktop\folders>dir
 O volume na unidade C não tem rótulo.
 O número de série do volume é 8888-1666

 Diretório de C:\Users\John\Desktop\folders

29/01/2011 19h16 .
29/01/2011 19h16 ..
29/01/2011 19h07 algum nome de pasta (2008)
29/01/2011 19h07 algum nome de pasta (2009)
29/01/2011 19h16 282 ren.pl
               1 Arquivo(s) 282 bytes
               4 diretório(s) 53.349.425.152 bytes livres

Responder2

Eu sugiro executar os nomes dos arquivos por meio de um script sed curto. for file in dir/with/files/*; do name=$(basename "$file" | sed 's/\./ /g;s/\([12][09][0-9][0-9]\)/(\1)/'); mv "$file" "$(dirname \"$file\")/$name"; done. Substitui os pontos por espaços e depois coloca o ano entre parênteses.

Certifique-se de que, se você estiver digitalizando/operando nesses arquivos, eles estejam devidamente citados. Os espaços são frequentemente usados ​​como delimitadores entre itens.

Responder3

EmPowerShell(que acredito estar instalado por padrão no Win7, embora eu não tenha uma máquina Windows, então posso estar errado),

gci *.* | %{
 mi $_ ($_.name.replace('.', ' ').insert($_.name.lastindexof('.')+1, '(')+')')
}

informação relacionada