Como eu posso facilmente granel arquivos Renomear com Perl?
Pergunta
Eu tenho um monte de arquivos que eu estou tentando mudar o nome, eu tentei fazer uma expressão regular para coincidir com eles, mas mesmo que eu fiquei preso nos arquivos são nomeados como:
Nome do arquivo 01
Nome do arquivo 100
Nome do arquivo 02
Nome do arquivo 03
etc, eu gostaria de adicionar um "0" (zero), por trás de qualquer de arquivo que são menos de 100, como este:
Nome do arquivo 001
Nome do arquivo 100
Nome do arquivo 002
Nome do arquivo 003
O mais próximo que eu cheguei a tanto como combiná-los estava usando este achado do tipo d | tipo -r | grep '[1-9] [0-9] $' no entanto eu não conseguia descobrir como para substituí-los. Agradecemos antecipadamente por qualquer ajuda que você pode me oferecer. Im no CentOS se é de alguma ajuda, tudo isso está sendo feito via SSH.
Solução
perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}'
Um pouco exagero, talvez, mas ele faz o que é solicitado.
Outras dicas
find . -type d -print0 | xargs -0 rename 's/(\d+)/sprintf "%03d", $1/e'
ou algo parecido, desde
- Você tem GNU find e xargs GNU (por
-print0
e-0
) - Você tem o utilitário 'renomear' que vem com perl
- Há apenas um grupo de dígitos no nome do arquivo. Se houver mais de um, então você precisa fazer algo com o regex para fazer isso só combinar com o número que você deseja reformatar.
Isso é uma coisa de uma só vez? Se assim for, eu vou sugerir algo que pode parecer ser um policial fora por muitos programadores aqui:
canalizar a saída do seu comando (find -type d | sort -r | grep ' [1-9][0-9]$'
) para um arquivo e usar um editor, juntamente com alguns pesquisa global / substituir mágica para criar um script que faz as renomeações.
Em seguida, jogue fora o script.
Há pouco barulho e pouca chance de que você vai acabar atirando no próprio pé por ter alguma tentativa de um inteligente (mas inadequadamente depurado) one-liner sair para as ervas daninhas em seus arquivos.
executar dois comandos, nesta ordem:
$ rename 's/File Name (\d)$/File Name 0$1/' *
$ rename 's/File Name (\d\d)$/File Name 0$1/' *
O primeiro renomeia tudo menos de 10 e prepends a zero. O segundo renomeia tudo menos de 100 e prepends a zero. O resultado deve ser três dígitos para todos os nomes de arquivos.
Na minha debian ele funciona bem com renomeação, testado com 300 arquivos.
perl -e 'map `touch door$_.txt`, 1..300;'
rename 's/(\d+)\.txt/sprintf("%03d.txt", $1)/e' *.txt
mmv é seu amigo aqui.
você poderia fazer algo usando Perl ou Ruby.
colocar todos estes arquivos no mesmo diretório
dirlisting = DIR.entries('.')
dirListing.each do |file|
num = file.match(/\d+$/).to_i
if num < 100
find the position where start the number, with index and inject the 0 there.
end
end
use strict;
use File::Copy;
my @files = glob 'File*Name*';
foreach my $filename (@files) {
if ($filename =~ m`^.*File.*Name.*?(\d+)`) {
my $number = $1;
next if ($number > 99);
rename $filename, sprintf("FileName%03d",$number);
}
}
Se o seu controle remoto tem shell bash
for i in File*;
do
case "${i##* }" in [0-9][0-9] )
echo mv "$i" "${i% *} $(printf "%03d" ${i##* })" ;;
esac;
done
Remover "echo" para fazer renomeação real