
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, '(')+')')
}