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"


1 comentario:

huitzache dijo...

Sencillo en su claridad, majestuoso en su integración y utilidad. Gracias

Datos personales