Renomeando arquivos em ordem lexicográfica com um padrão numérico que aumenta sequencialmente com preenchimento fixo

6

Eu tenho arquivos como

a
bb
ccc
abc
emrls

Eu gostaria de renomeá-los para que, depois de classificá-los (por exemplo, lexicograficamente), cada arquivo receba o seguinte nome:

00001
00002
00003
etc

em que o # de dígitos para o preenchimento 0 é especificado a priori, por ex. 6 no caso acima (assumindo que sabemos quantos dígitos são necessários).

Como o shell com o qual estou mais confortável é zsh , estou interessado em soluções que se beneficiam de recursos em zsh (talvez usando zsh 's zmv ?). Eu também estaria interessado em soluções compatíveis com o Bash.

    
por Amelio Vazquez-Reina 09.12.2011 / 18:46

2 respostas

10

Você pode usar o l sinalizador de expansão de parâmetro para preencher um número à esquerda.

i=0; for x in *; do ((++i)); mv -- $x new/${(l:6::0:)i}; done

Existe uma maneira relativamente simples de fazer isso com apenas recursos POSIX: inicie a numeração em 1000001 (para 6 dígitos) em vez de 1 e retire o primeiro 1 . É menos simples, mas alguns caracteres mais curtos.

i=1000000; for x in *; do i=$((i+1)); mv -- "$x" new/${i#1}; done

Se você quiser aproveitar o zmv , use uma expressão aritmética que aumente i no texto de substituição.

i=0; zmv '*' '${(l:6::0:)$((++i))}'
i=1000000; zmv '*' '${$((++i))#1}'

Adicione o o qualificador se você precisar classificar os arquivos em uma ordem diferente. Com zmv , você precisa passar o sinal -Q quando o padrão contiver qualificadores glob.

    
por 09.12.2011 / 19:13
2

Espero que este snippet bash o ajude.

[centos@centos new]$ touch a bb ccc dddd eee f gh i
[centos@centos new]$ touch abc emrls cdg sf
[centos@centos new]$ touch ABC A BB CCC DD GI KLM kmna kabc mas nas san fin zoo
[centos@centos new]$ \ls -1
a
A
abc
ABC
bb
BB
ccc
CCC
cdg
DD
dddd
eee
emrls
f
fin
gh
GI
i
kabc
KLM
kmna
mas
nas
san
sf
zoo
[centos@centos new]$ a=0; for i in *; do a=$(($a+1));  b='printf "%06d" $a'; mv -v ${i} ${b};  done
'a' -> '000001'
'A' -> '000002'
'abc' -> '000003'
'ABC' -> '000004'
'bb' -> '000005'
'BB' -> '000006'
'ccc' -> '000007'
'CCC' -> '000008'
'cdg' -> '000009'
'DD' -> '000010'
'dddd' -> '000011'
'eee' -> '000012'
'emrls' -> '000013'
'f' -> '000014'
'fin' -> '000015'
'gh' -> '000016'
'GI' -> '000017'
'i' -> '000018'
'kabc' -> '000019'
'KLM' -> '000020'
'kmna' -> '000021'
'mas' -> '000022'
'nas' -> '000023'
'san' -> '000024'
'sf' -> '000025'
'zoo' -> '000026'
[centos@centos new]$ 
    
por 09.12.2011 / 19:00