2018-03-06

Busqueda de fondos de pantalla

bash script para Linux debian-based

Hace tiempo que no publicaba nada por estos lares, pero hoy se me ocurrió pulir y compartir un script que hice hace unas semanas cuando buscaba cambiar mi carpeta de fondos aleatorios de forma automática.
Como bien verán en la imágen, el script lista (y copia si se desea) todas las imagenes con cierta relación de aspecto que encuentre en la carpeta donde se ejecuta, aunque tambien puede hacerlo en forma recursiva si se quiere revisar una carpeta con varias en su interior.

fah_list-walls - Ayuda y modo de empleo

Para hacerlo un poco más cómodo al uso, el valor que se ingresa como "relación de aspecto", puede en realidad ser expresado de varias maneras: "X:Y" como suele usarse hoy en día (ej. 16:9, 4:3, etc), en decimal con coma o punto (ej. 1.77 o 1,33), o como medidas en pixeles específicas (ej. 1280x720, 800x600, etc); y si se le definen 2 valores (mínimo y máximo) separados por ";" (punto y coma), fah_list-walls buscará todas las imagenes que concuerden con tal rango.
De todas maneras todo lo comentado se encuentra escrito en la Ayuda y modo de empleo que pueden visualizar, una vez "instalado" el script, ejecutando:
fah_list-walls -h

El mismo hace uso de paquetes que ya suelen venir por defecto en cualquier distribución basada en debian (como Linux Mint ó MX Linux, x ej), pero por las dudas dejo el comando para instalar las dependencias más improbables (otras como cp o tr es casi imposible que no existan instaladas):
sudo apt install -y bc imagemagick


Sin más que comentar, si desean usarlo tendrán que crear un archivo llamado fah_capture-screen dentro de /usr/local/bin/:
sudo nano /usr/local/bin/fah_capture-screen

Pegar el código del script en el mismo (Ctrl+Shift+V):
#!/bin/bash

# Versión 20170306

# Ayuda y modo de empleo
mostrarAyuda () {
  echo -e "\n\tLista todas las imagenes que correspondan al rango de relacion de aspecto ingresado. El script crea un archivo .LOG de la misma lis$
  echo -e "\tSi no se especifica rango, se busca por la relacion de aspecto 16:9 (1.77)";
  echo -e "\nUSO:"
  echo -e "\t${0##*/} [ -a <VALOR> | -c <VALOR> | -h | -l [<VALOR>] | -r |-s ]"
  echo -e "\nOPCIONES:"
  echo -e '\t-a\tAspect Ratio: Relacion de aspecto a buscar escrita como division, decimal o medida especifica en pixeles; pueder ser una en espec$
  echo -e "\t-c\tCopy: Define la direccion del directorio (path) a donde copiar los archivos que coincidan con la busqueda."
  echo -e "\t-h\tHelp: Ayuda y modo de empleo."
  echo -e "\t-l\tLog: Define el archivo de log. Por defecto: \"./FECHA_HORA.log\""
  echo -e "\t-r\tRecursive: Define que la busqueda sera recursiva a partir del directorio raiz en el que se ejecuta la misma."
  echo -e "\t-s\tSilence: Realiza el proceso sin crear log aunque haya sido definido en -l"
  echo -e "\nEJEMPLOS:"
  echo -e '\t'${0##*/}
  echo -e '\t'${0##*/}' -a "4:3"'
  echo -e '\t'${0##*/}' -s -a "1.70;1.78"'
  echo -e '\t'${0##*/}' -a "1366x768" -c /mi/directorio/de/fondos/'
  echo -e '\t'${0##*/}' -l milog.log -a "1399x768"'
  echo -e '\t'${0##*/}' -r -l milog.log'
  echo -e ""
}

# Valores por defecto
FECHA=$(date +"%Y%m%d_%H%M%S");
LIST="./$FECHA.txt";
DIR="";
RECURSIVE="";
MIN_AR="1.77";
MAX_AR="1.77";
CANT=0;

# Procesamiento de parametros
while getopts 'a:c:hl:rs' OPCION ; do
  case $OPCION in
    a)
      AUX=$OPTARG ;
      MIN_AR=$(echo "${AUX%%;*}") ;
      MAX_AR=$(echo "${AUX##*;}") ;
      MIN_AR=$(echo "$MIN_AR" | tr \:Xx \/);
      MAX_AR=$(echo "$MAX_AR" | tr \:Xx \/);
      MIN_AR=$(echo "$MIN_AR" | tr , .);
      MAX_AR=$(echo "$MAX_AR" | tr , .);
      MIN_AR=$(echo "$MIN_AR"  | bc -l);
      MAX_AR=$(echo "$MAX_AR"  | bc -l);
      if [ $(echo "$MIN_AR > $MAX_AR" | bc) -eq 1 ] ; then
        echo -e "\nWARNING: MIN=$MIN_AR no puede ser mayor a MAX=$MAX_AR\n\tSe asume MIN=$MAX_AR y MAX=$MIN_AR" ;
        AUX=$MIN_AR;
        MIN_AR=$MAX_AR;
        MAX_AR=$AUX;
      fi
      ;;
    c)
      COPY=$OPTARG ;
      ;;
    h)
      mostrarAyuda ;
      exit 0 ;
      ;;
    l)
      LIST=$OPTARG ;
      ;;
    r)
      RECURSIVE="TRUE";
      ;;
    s)
      LIST="" ;
      ;;
    \?)
      echo -e "\nERROR: -$OPTARG no es un parametro valido" ;
      mostrarAyuda ;
      ;;
    :)
      echo -e "\nERROR: Opción -$OPTARG requiere un valor" ;
      mostrarAyuda ;
      exit 1 ;
      ;;
  esac
done

# BUSQUEDA DE IMAGENES
checkImages () {
  for FILE in "$DIR"*.{png,jpg,jpeg,bmp,tiff} ; do
    if [ -f "$FILE" ] ; then
      SIZE=$(identify -format '%w/%h' "$FILE");
      if [ ! -z "$SIZE" ] ; then
        AR=$(echo "$SIZE" | bc -l);
        if [ $(echo "$AR >= $MIN_AR" | bc) -eq 1 ] && [ $(echo "$AR <= $MAX_AR" | bc) -eq 1 ] ; then
          if [ -z "$LIST" ] ; then
            LIST="/dev/null" ;
          else
            echo -e "$FILE" > "$LIST" ;
            if [ -f "$LIST" ] ; then
              LIST=$(readlink -f "$LIST") ;
            else
              echo -e "\nERROR: No se encontro el listado de archivos";
              exit 1;
            fi
          fi
          echo "$FILE";
          let CANT+=1;
          if [ ! -z "$COPY" ] ; then
            cp "$FILE" "$COPY" ;
          fi
        fi
      fi
    fi
  done
}

checkImages ;
if [ ! -z "$RECURSIVE" ] ; then
  for DIR in */ ; do
    checkImages "$DIR";
  done
fi

echo -e "\nImagenes que corresponden a la busqueda: $CANT";

Cerrar el archivo (Ctrl+X) y aceptar guardar las modificaciones cuando nano lo pregunte.

Y por último darle permisos de ejecución:
sudo chmod +x /usr/local/bin/fah_list-walls


Que lo disfruten ^_^

No hay comentarios.:

Publicar un comentario