2008-09-11 17 views

Respuesta

25

En caso N no es una fija a priori:

for f in foo[0-9]*; do mv $f `printf foo%05d ${f#foo}`; done 
2

El siguiente lo hará:

for i in ((i=1; i<=N; i++)) ; do mv foo$i `printf foo%05d $i` ; done 

EDIT: cambiado para usar ((i = 1, ...)), gracias mweerden!

+0

En lugar de utilizar la SEC Yo sugeriría a escribir para ((i = 1; i <= N; i ++)); haz etc.Además de ser parte de bash, esto también evita tener que generar primero todos los números y luego ejecutarlos. – mweerden

0

Aquí hay una solución rápida que supone un prefijo de longitud fija (su "foo") y un relleno de longitud fija. Si necesita más flexibilidad, tal vez este sea al menos un punto de partida útil.

#!/bin/bash 

# some test data 
files="foo1 
foo2 
foo100 
foo200 
foo9999" 

for f in $files; do 
    prefix=`echo "$f" | cut -c 1-3`  # chars 1-3 = "foo" 
    number=`echo "$f" | cut -c 4-`   # chars 4-end = the number 
    printf "%s%04d\n" "$prefix" "$number" 
done 
4

Bash puro, no hay procesos externos que no sean 'mv':

for file in foo*; do 
    newnumber='00000'${file#foo}  # get number, pack with zeros 
    newnumber=${newnumber:(-5)}  # the last five characters 
    mv $file foo$newnumber   # rename 
done 
13

que tenía un caso más complejo, donde los nombres de los archivos tenían un postfijo así como un prefijo, y también necesitaba realizar una resta en el número del nombre del archivo. Así que quería que foo56.png se convirtiera en foo00000055.png. Espero que esto ayude si estás haciendo algo más complejo.

#!/bin/bash 
for file in foo[0-9]*.png; do 
    # strip the prefix ("foo") off the file name 
    postfile=${file#foo} 
    # strip the postfix (".png") off the file name 
    number=${postfile%.png} 
    # subtract 1 from the resulting number 
    i=$((number-1)) 
    # copy to a new name in a new folder 
    cp ${file} ../newframes/$(printf foo%08d.png $i) 
done 
44

No es fiesta puro, pero mucho más fácil con el comando rename:

rename 's/\d+/sprintf("%05d",$&)/e' foo* 
+0

También maneja nombres de archivos con espacios. – palacsint

1

El comando oneline que yo uso es la siguiente:

ls * | cat -n | while read i f; do mv "$f" `printf "PATTERN" "$i"`; done 

patrón puede ser por ejemplo:

  • cambiar el nombre con incre contador ción: %04d.${f#*.} (mantener la extensión de archivo original)
  • cambiar el nombre con el contador de la subasta con el prefijo: photo_%04d.${f#*.} (mantenga extensión original)
  • cambiar el nombre con el contador de incremento y extensión cambio en jpg: %04d.jpg
  • cambiar el nombre con el contador de la subasta con el prefijo y archivo de nombre base: photo_$(basename $f .${f#*.})_%04d.${f#*.}
  • ...

puede filtrar el archivo para cambiar el nombre con, por ejemplo ls *.jpg | ...

Tiene disponible la variable f que es el nombre del archivo y i que es el contador.

Por su pregunta el comando correcto es:

ls * | cat -n | while read i f; do mv "$f" `printf "foo%d05" "$i"`; done 
Cuestiones relacionadas