scripts script resueltos programas paso pasar parametros hacer español ejercicios ejemplos como bash rename

bash - programas - scripts linux ejercicios resueltos



Cómo poner a cero los números de los pads en los nombres de los archivos en Bash? (7)

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

¿Cuál es la mejor manera, utilizando Bash, para cambiar el nombre de los archivos en el formulario:

(foo1, foo2, ..., foo1300, ..., fooN)

Con nombres de archivo sin relleno:

(foo00001, foo00002, ..., foo01300, ..., fooN)


En caso de que N no se haya fijado a priori:

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


Pure Bash, sin 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


Tenía un caso más complejo, donde los nombres de los archivos tenían un sufijo y 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


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

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


Lo siguiente lo hará:

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

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


El comando en línea que uso es este:

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

PATTERN puede ser, por ejemplo:

  • renombrar con contador de incrementos: %04d.${f#*.} (mantener la extensión de archivo original)
  • renombrar con contador de incrementos con el prefijo: photo_%04d.${f#*.} (mantener la extensión original)
  • cambiar el nombre con el contador de incremento y cambiar la extensión a jpg: %04d.jpg
  • cambiar el nombre con el contador de incrementos con el prefijo y el nombre del archivo: photo_$(basename $f .${f#*.})_%04d.${f#*.}
  • ...

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

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

Para su pregunta, el comando correcto es:

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