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