Cambiar el nombre de los files en order lexicográfico con un patrón numérico que aumenta secuencialmente con relleno fijo

Tengo files como

a bb ccc abc emrls 

Me gustaría cambiarles el nombre para que, después de orderarlos (por ejemplo, lexicográficamente), cada file tenga el siguiente nombre:

 00001 00002 00003 etc 

donde el # de dígitos para el relleno 0 se especifica a priori, por ejemplo 6 en el caso anterior (suponiendo que sepamos cuántos dígitos se necesitan).

Dado que el shell con el que me siento más cómodo es zsh , me interesan las soluciones que se benefician de las características de zsh (¿tal vez con zmv zsh ?). También me interesarían las soluciones compatibles con Bash.

Puede usar el indicador de expansión de parámetro l para rellenar un número a la izquierda.

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

Hay una forma relativamente simple de hacerlo con solo las características de POSIX: comience la numeración en 1000001 (para 6 dígitos) en lugar de 1, y quite el 1 principal. Es less sencillo pero con algunos caracteres más cortos.

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

Si desea aprovechar zmv , puede usar una expresión aritmética que incremente i dentro del text de reemploop.

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

Agregue el calificador o glob si necesita orderar los files en un order diferente. Con zmv , debe pasar el indicador -Q cuando el patrón contiene calificadores glob.

Espero que este fragment bash te ayude.

 [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]$