El otro d铆a me lleg贸 un problema interesante, ten铆a una colecci贸n de archivos en formato PDF que se ten铆an que imprimir en orden.
Bueno, al principio no sab铆a que ten铆a que ser en orden y para imprimir todos los archivos de una capeta s贸lo use el comando:
lpr *.pdf
Y cumpl铆a con el objetivo de imprimir todos los archivos PDF de la carpeta, pero luego result贸 que el orden de impresi贸n era importante (para buscarlos posteriormente) y es donde el problema se complic贸 un poco, porque hacerlo a mano simplemente no era una opci贸n 隆Son demasiados!.
Orden alf谩betico o n煤merico.
El problema es que una cosa es el orden alfab茅tico y otro muy distinto el orden num茅rico.
Por ejemplo, tengo esta colecci贸n de archivos:
- 1.pdf
- 521.pdf
- 002.pdf
- 11.pdf
- 0850.pdf
El resultado de un ordenamiento est谩ndar ser铆a el siguiente:
archivos = ["1.pdf","521.pdf","002.pdf","11.pdf","0850.pdf"]
puts archivos.sort
- 002.pdf
- 0850.pdf
- 1.pdf
- 11.pdf
- 521.pdf

orden alfanumerico en ruby
Como pueden ver, est谩n bien ordenados, pero de manera alfan煤merica. Es una cuesti贸n de interpretaci贸n de los datos y generalmente el nombre de un archivo se considera un dato alfan煤merico.
Y el caso se complica a煤n m谩s porque la longitud del nombre del archivo no es la misma.
Aunque es correcto no es el efecto que deseo.
La soluci贸n: Naturally
Buscando en Google d铆 con Naturally una gema de Ruby que se encarga de interpretar de una forma m谩s humana este tipo de ordenamientos n煤mericos.
Para usar Naturally primero hay que instalarlo.
gem install naturally
Y este es un ejemplo de su uso:
require 'naturally'
archivos = ["1.pdf","521.pdf","002.pdf","11.pdf","0850.pdf"]
ordenados = Naturally.sort(archivos)
El resultado del ordenamiento es:
- 1.pdf
- 002.pdf
- 11.pdf
- 521.pdf
- 0850.pdf

Resultado del ordenamiento usando Naturally.
Y ahora si, el orden es el que precisamente estoy buscando 隆Yeeeeeei!
A imprimir.
A estas alturas ya estaba muy cerca de la soluci贸n, ahora solo ten铆a que desarrollar un programa en Ruby que leyera todos los archivos PDF de una carpeta, los ordenara de forma natural y mandar imprimir cada archivo.
require 'naturally'
# Obtiene la lista de archivos con extensi贸n PDF.
archivos = Dir.glob('*.{pdf,PDF}')
# Ordena la lista de archivos de forma natural
# y lo guarda en la variable ordenados.
ordenados = Naturally.sort(archivos)
# Imprime los archivos en el orden deseado.
ordenados.each do |archivo|
system("lpr", archivo) or raise "Fall贸 la impresi贸n"
end
Al ejecutar el script empieza la impresi贸n de los archivos PDF en la impresora predeterminada uno por uno, pero ahora en el orden que quiero.
Espero que este art铆culo les sea de utilidad. Todav铆a intuyo que es posible hacerlo en bash, pero como ya lo resolv铆 este problema utilizando Ruby y funciona tan bien que voy a dar por cerrado el tema.
Ahora con Bash
Gracias a este comentario en google plus de Rodolfo Zola que me aclar贸 como resolver el mismo problema usando bash y el comando sort.
#!/bin/bash
# Lista todos lo archivos PDF
# y los imprime en orden n煤merico.
for i in `ls *.pdf|sort -n`
do
lpr $i
done
Y funciona perfectamente, s贸lo lo modifiqu茅 un poco para que solamente imprimiera archivos pdf.
Actualizaci贸n.
Al final me decant茅 por usar el script en bash , le agregu茅 una pausa de 8 segundos ( sleep 8) para no saturar la cola de impresi贸n de la impresora de red a la que mando el trabajo y como cereza del pastel, se pueden fijar que ahora el comando lpr especifica que la impresi贸n ser谩 en聽hoja tama帽o carta y adem谩s hiciera un ajuste en el tama帽o de la impresi贸n con la opci贸n聽fit-to-page.
#!/bin/bash
# Lista todos lo archivos PDF
# y los imprime en orden n煤merico.
for i in `ls *.pdf|sort -n`
do
lpr -o fit-to-page -o media=Letter $i
echo $i
sleep 8
done
echo "Impresi贸n terminada."
Para finalizar copi茅 el archivo printsort.sh a la carpeta /usr/bin para que lo pueda llamar a ejecuci贸n desde cualquier ubicaci贸n de mi sistema.
