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.

Foi útil?

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

  1. Você tem GNU find e xargs GNU (por -print0 e -0)
  2. Você tem o utilitário 'renomear' que vem com perl
  3. 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top