Como os nomes dos arquivos não contêm caracteres especiais, incluindo espaços, isso pode ser feito facilmente usando ls -r
(que é -r
para --reverse
, não -R
para --recursive
).
/tmp/todo$ ls
/tmp/todo$ touch ab bc bd ef
/tmp/todo$ ls
ab bc bd ef
/tmp/todo$ ls -r
ef bd bc ab
/tmp/todo$
Então você pode renomear os arquivos usando algo como:
num=1
for file in $(ls -r)
do
mv $file "$(seq --format='%02g' $num $num)${file}"
num=$(( $num + 1 ))
done
Isso usa seq
para formatar o número para usar dois dígitos ( 2
) preenchidos com zero à esquerda ( %0
) sem casas decimais ( g
) para uma string de formato total de %02g
. Há provavelmente uma maneira mais eficiente de fazer isso, mas com tão poucos arquivos, eu não me incomodaria com micro-otimização.
Isso simplesmente itera a lista de arquivos (na ordem inversa), renomeia cada um por vez e incrementa um contador para cada renomeação.
O resultado final é:
/tmp/todo$ ls
01ef 02bd 03bc 04ab
/tmp/todo$
Note que o acima pode muito bem desmoronar se os nomes dos arquivos tiverem algo mais incomum neles do que simples a-z, pontos e dígitos para começar. Particularmente, não sei ao certo o quão bem ele vai lidar com espaços.