Solução Perl
perl -e '
@files = sort glob "*.png *.jpg";
for(@files){
($extension = $_) =~ s/.*\.(.*)/$1/;
$new_name = sprintf("%04d",++$counter).".$extension";
die "File $new_name already exists and would be clobbered\n" if -e $new_name;
rename $_ => sprintf("%04d",++$counter).".$extension"
}'
Solução de bash
export COUNT=0
find . -maxdepth 1 -name "*.jpg" -o -name "*.png" -print0 | xargs -0 sort | while read file do\
extension=${file##*.}\
COUNT=$((COUNT+1))\
mv -- "$file" $(printf "%04d" $COUNT).$extension\
done
Nota
-
Ambas as soluções sãoA solução Bash não foi testada: tenteelasem arquivos falsos primeiro. - A solução Bash pode quebrar se você tiver nomes de arquivos com novas linhas neles.
- Perigo: Como apontado por Gilles nos comentários abaixo, se um dos arquivos originais tiver um nome que segue a convenção de nomenclatura de destino, ele será, na melhor das hipóteses, renomeado para outro "número" e na pior das hipóteses espancado por outro arquivo. Qual deles acontece vai depender de como ele se classifica em relação a outros arquivos. Eu adicionei uma provisão para isso na solução Perl, já que esta é a que o OP parece favorecer.
- A solução Perl (com a disposição do ponto acima implementado) é não idempotente .