viernes, 28 de junio de 2013

Contar hojas de PDF's desde terminal LINUX

Resulta que en mi trabajo nos es necesario obtener  un reporte con el numero de paginas de infinidad de archivos .pdf, por ello me di a la tarea de buscar algo que me resolviera el problema, sin embargo no hay una aplicación que propiamente lo haga y ademas haga una búsqueda recursiva de los archivos en distintas carpetas.

Pongo como referencia el siguiente vinculo ya que de ahí saque una pequeña parte del script:

http://www.hermann-uwe.de/blog/counting-pages-in-multiple-pdfs-from-the-command-line-using-pdfinfo-or-pdftk

Espero que a alguno le sirva. Se aceptan comentarios. =P


#!/bin/bash
#####################################
#                                   #
#    Contar hojas de archivos pdf   #
#    en distintas carpetas          #
#                                   #
#    Arturo Jimenez                 #
#    arturo.jimenez.26@gmail.com    #
#                                   #
#    Version 1   [26 Junio 2013]    #
#                                   #
#####################################

#limpia pantalla
clear

#######################################
# Verificacion de usuario root        #
#######################################

if [ "$(whoami)" != 'root' ];
then
 echo "Es necesario ejecutar este script como root."
 exit 1;
fi

#######################################
# Se revisa que no existan los        #
# archivos que usa el script          #
# en caso de haberlos los elimina     #
#######################################

if [ -f list_pdfs ]
 then
 rm list_pdfs
fi

if [ -f repfinal ]
 then
 rm repfinal
fi


#######################################
# Se le pide la ruta de ejecucion     #
# al usuario                          #
#######################################

# Se obtiene ruta actual
r_actual=`pwd`/

# Pregunta al usuario
echo -n "Desea ejecutar el script en la ruta actual $r_actual [s/n]:"
read answ

# Validacion respuesta
while [[ "$answ" != "s" && "$answ" != "n" ]];
do 
 echo "No ingreso una respuesta valida"
 echo -n "Desea ejecutar el script en la ruta actual $r_actual [s/n]:"
 read answ
done

# En caso de no, ¿Donde se va a ejecutar?
if [ "$answ" == "n" ];
then 
 echo -n "Escriba la ruta donde desea ejecutar el script: "
 read media
 rt=0

# Valida que la ruta que ingreso el usuario exista
 while [ $rt -eq 0 ];
 do
  if [ -d "$media" ];
  then
   echo "El directorio es valido"
   rt=1
  else
   echo "No ingreso una ruta valida"
   echo -n "Escriba la ruta donde desea ejecutar el script: "
   read media
  fi
 done

 echo -e "La ruta seleccionada es: $media\n"
else 
 media=$r_actual
 echo -e "La ruta seleccionada es: $media\n"
fi

#######################################
# Con find examinamos la ruta y se    #
# genera un archivo con la lista de   #
# PDF's a procesar                    #
#######################################

find "$media" -name *.pdf > list_pdfs

#######################################
# Se determina el numero de archivos  #
# a procesar                          #
#######################################

largo=`wc -l list_pdfs | cut -d " " -f 1`

#######################################
# Con date se obtiene la hora en seg  #
# para despues tener el tiempo de     #
# ejecucion del comando               #
#######################################

fecha1=`date +%s`

#######################################
# Inicia el conteo de los PDF's       #
# mediante un while donde se esta     #
# procesando linea por linea las      #
# rutas generadas por find            #
#######################################

i=1
while (test ${i} -le ${largo});
do
 f=`sed -n "$i"p list_pdfs`                                     #se obtiene una linea solamente
 directorio=$(dirname "$f")                                     #se obtiene ruta
 archivo=$(basename "$f")                                       #se obtiene archivo
 echo -n "${directorio}| " >> repfinal                          #se escribe la ruta del pdf en el reporte
 echo -n "${archivo}| " >> repfinal                             #se escribe el nombre del archivo
 var=`pdfinfo "$f" 2>/dev/null | grep Pages | cut -d ":" -f 2`  #se obtiene el numero de páginas
 echo $var >> repfinal                                          #se escribe el numero de paginas junto a la ruta
 i=`expr $i + 1`
done

echo -e "\ntotal de pdf procesados: $largo" >> repfinal
echo -e "total de pdf encontrados: $largo \n"
echo -e "Se genero el reporte llamado:\n repfinal\n"

#######################################
# Se obtiene la segunda fecha y       #
# se hace una resta para obtener      #
# el tiempo de ejecucion en segundos  #
#######################################

fecha2=`date +%s`

tiempo=`expr $fecha2 - $fecha1`

echo -e "El tiempo de ejecucion del comando fue de $tiempo segundos"


jueves, 20 de junio de 2013

Jugando con el prompt y la terminal

¿Que es el prompt?

Es el conjunto de caracteres que se muestran en una línea de comandos para indicar que está a la espera de órdenes. En linux específicamente se puede ver de la siguiente manera:


Usuario@hostname:ubicacion$
root@hostname:ubicacion#


La primera parte corresponde al usuario logueado en la terminal, la segunda al nombre que tiene asignado el equipo seguido por la ruta donde uno se encuentra ubicado (ej. /home/usuario/Documentos  o ~), por ultimo los simbolos $ y # identifican si somos usuarios normales o root.

Es posible cambiar el aspecto de nuestro prompt, haciendo que muestre otros datos como la fecha. Esto lo hacemos modificando el archivo .bashrc que esta en el home de cada usuario (/home/usuario/.bashrc), específicamente cambiando las siguientes lineas (La que empieza con PS1).

 # If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
 PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

La parte marcada de amarillo es la que esta determinando como se va a ver nuestro prompt, podemos usar las siguientes opciones:

\a un caracter ASCII de ring
\d la fecha actual en formato "dia_sem mes día"
\e un caracter ASCII de escape
\h el nombre del equipo hasta el primer .
\H el nombre del equipo
\n nueva línea
\r retorno, enter
\s el nombre del shell
\t el tiempo actual en formato de 24 horas HH:MM:SS
\T el tiempo actual en formato de 12 horas HH:MM:SS
\@ el tiempo actual en formaro de 12 horas con am/pm
\u el usuario actual
\v la version de bash
\V el número de release de batch, versión + parche
\w el directorio de trabajo actual, path
\W el nombre del directorio actual
\! el número en el historial del comando
\# el número de comando de este comando
\$ si el usuario es root (UID=0) se indica un '#', un usuario normal '$'
\\ diagonal
\[ inicio de una secuencia de caracteres no imprimibles
\] fin de la secuencia de caracteres no imprimibles

También es posible cambiar el color de nuestro prompt, para ello hay que descomentar una linea del .bashrc

# uncomment for a colored prompt, if the terminal has the ...
# off by default to not distract the user: the focus ...
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

Solo hay que quitar el numeral (#) para descomentar, con ello se habilitan los colores predeterminados que posteriormente podemos modificar. Por el momento se va a ver así:


Podemos usar las siguientes variables de color para modificar a nuestro gusto, estas variables se delimitan como caracteres no imprimibles ej. \[\033 [color \]

Negro          00;30m          Gris obscuro   01;30m
Rojo           00;31m          Rojo claro     01;31m
Verde          00;32m          Verde claro    01;32m
Café           00;33m          Amarillo       01;33m
Azul           00;34m          Azul claro     01;34m
Púrpura        00;35m          Púrpura claro  01;35m
Cian           00;36m          Cian claro     01;36m
Gris claro     00;37m          Blanco         01;37m
Estas variables de color las cambiamos en la siguiente parte del .bahsrc que esta unas pocas lineas debajo de donde descomentamos force_color_prompt=yes

if [ "$color_prompt" = yes ]; then
 PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

Como podemos ver ya vienen puestos algunos colores, los cuales cambiaremos a gusto. Ejemplo y resultado:

if [ "$color_prompt" = yes ]; then
  PS1='${debian_chroot:+($debian_chroot)}\[\033[00;31m\]\u\[\033[00;32m\]@\[\033[01;33m\]\h\[\033[01;34m\]:\[\033[01;35m\]\w\[\033[00m\]\$ '


Otra cosa interesante que se puede hacer con la terminal, es que al iniciar nos muestre un texto, por ejemplo un banner de bienvenida o arte ASCII, ejemplo:


No es necesario matarse poniendo un símbolo tras símbolo, hay muchas páginas donde podemos encontrar imágenes al gusto de cada quien, por ejemplo http://ascii-art.de/, la forma de ponerlo es guardando el documento como texto plano y después hacer un cat en la parte superior de nuestro .bashrc

[[ $- == *i* ]] || return

cat ~/lobo

# ~/.bashrc: executed by bash(1) for non-login shells.

El documento lo podemos colocar en la parte que deseemos solo tenemos que poner la ruta completa, si lo pusimos en documentos sería /home/usuario/Documentos/lobo o como yo lo puse en mi home lo coloque usando ~ que es una forma de abreviar /home/usuario

La linea que puse antes del cat es necesaria para evitar errores al momento de hacer transferencias de archivos con scp, eso ya lo explicare con calma en otro post.

En fin, poco a poco iré poniendo mas chácharas para la terminal. Cualquier duda  o comentario es bien recibido.

=P


martes, 4 de junio de 2013

Trabajando como linuxero

Bien, hace 6 años (aproximadamente) me encontraba instalando Ubuntu en mi laptop y creo que fue amor a primera vista, bueno y un poco mi necesidad de sentirme diferente.

Jamas me imagine que me dedicaría a esto a decir que hoy día mi trabajo depende de mis habilidades como linuxero.

En fin, quiero comenzar a formar parte activa de la comunidad, de aquellos blogs que mas de una vez me han salvado el pellejo, me gustaría saber que de los artículos que escribiré alguien pudo modificar su sistema o salvar su info o lo que sea.

Pues bien, intentaré escribir por lo menos 3 veces a la semana sobre temas que vayan de lo mas sencillo a cosas extravagantes, pero siempre cosas que me hayan o me esten siendo útiles para el trabajo. 

Sean felices

Datos personales