Como reformatar números de seqüência em um lote de nomes de arquivos, por ex. A1.txt para A0001.txt? [duplicado]

3

Eu tenho alguns arquivos nomeados como A1.txt A2.txt ... A11.txt A12.txt, etc. Eu quero renomeá-los para A0001.txt A0002.txt ... A0011.txt etc. Estou fazendo certo?

for file in A*.txt
do
mv ${file} ${file/-#.txt-/-"%5d".txt}
done
    
por Christin 16.09.2016 / 01:19

2 respostas

6

Se você não tiver a opção prename sugerida por @ John1024, poderá usar o printf (um incorporado em bash , mas também disponível em GUN coreutils ) para formatar os dígitos decimais com a largura de campo desejada e preenchimento - infelizmente eu não acho que há uma expansão de shell de uma etapa para extrair os dígitos, o mais próximo que eu posso chegar é

for file in A*.txt
do
  base="${file%.*}"
  printf -v newfile "A%04d.txt" "${base#A}"
  mv -- "$file" "$newfile"
done
    
por 16.09.2016 / 01:55
5

Usando o utilitário de renomeação do Perl:

prename 's/(\d+)\./sprintf "%04d.", $1/e' A*.txt

prename às vezes está disponível com o nome rename . Existe, no entanto, outro utilitário não relacionado e incompatível chamado rename que é instalado por padrão em algumas distribuições.

Distribuições do tipo Debian, entre outras, têm o rename / nome do Perl instalado por padrão. Se a sua distribuição não, as instruções para instalá-lo podem ser encontradas aqui

(dica do Hat to Steeldriver para uma versão melhorada do comando).

Exemplo

Considere um diretório com esses arquivos:

$ ls
A12345.txt  A123.txt  A12.txt  A1.txt

Agora, vamos executar o prename:

$ prename 's/(\d+)\./sprintf "%04d.", $1/e' A*.txt
$ ls
A0001.txt  A0012.txt  A0123.txt  A12345.txt

Como funciona

Um único comando substituto é usado:

s/(\d+)\./sprintf "%04d.", $1/e
  • (\d+)\. corresponde a um ou mais dígitos seguidos de um ponto. Os dígitos são salvos no grupo 1.

  • O% final e diz ao perl para avaliar o comando sprintf "%04d.", $1 . Esse comando retorna os dígitos do grupo 1 no formato %04d , o que significa que quatro dígitos são preenchidos com zero, seguidos por um período.

por 16.09.2016 / 01:26