viernes, 14 de mayo de 2010

Dividiendo archivos desde Nautilus

En el último post hablaba del gestor de archivos Nautilus; de sus principales características y de cómo extender su funcionalidad usando nautilus-actions, un paquete disponible para Ubuntu. Para ilustrar este último asunto explicaba los pasos necesarios para añadir una opción al menú contextual que permita al usuario abrir una consola de comandos en el directorio elegido. A pesar de la sencillez del ejemplo (sin menospreciar su utilidad, simplemente invocaba a gnome-terminal con los argumentos adecuados) quedaba de manifiesto el potencial de estas acciones de Nautilus.

Hoy voy a intentar ampliar mi introducción presentando una nueva extensión que he programado recientemente. Se trata de añadir al menú contextual una opción que permita trocear cualquier archivo grande. En un post anterior repasaba varias utilidades que podemos usar tanto en Windows como en Linux para estos menesteres, pero ahora buscaremos la forma de hacerlo sin salir de Nautilus.

El procedimiento es el mismo que el visto en el anterior post sobre las Acciones de Nautilus: crear una nueva acción llamada Dividir y editarla para definir el nombre y descripción de la opción de menú asociada, así como el programa se debe ejecutar al elegirla y con qué parámetros. El programa que realizará el trabajo es split, utilidad estándar de GNU/Linux que permite trocear archivos desde la consola, pero como los argumentos a pasarle son algo retorcidos y además nos interesa comprobar ciertos asuntos antes de invocarlo, la solución pasará por programar un sencillo shell script que haga de "envoltorio", al que llamaremos na-split. Los detalles de la acción esta vez serán los siguientes:



En la solapa Condiciones marcaremos la opción Sólo archivos. Por lo demás solo nos quedará colocar el archivo na-split en un directorio de programas como /usr/local/bin y darle permisos de ejecución. El código que contiene es básicamente el siguiente:

#!/bin/bash

# Tamaño del trozo tal como lo entiende split (100*1024*1024 bytes)
trozo="100M"

# El 1er argumento recibido debe ser el directorio y el 2º el archivo
dir=$1
file=$2

# Se configura la herramienta a utilizar, split (de GNU coreutils)
tool=$(which split)

# Si no está disponible se muestra mensaje de error
if [ -z "$tool" ]; then
zenity --error --title "Dividir" \
--text "No se encontró el comando 'split'"
exit 1
fi

# Se comprueba si el tamaño del archivo es mayor de 100MB
sizeinbytes=$(ls -l $dir/$file | cut -d' ' -f5)

# Si no es así se muestra mensaje de error
if [ "$sizeinbytes" -le 104857600 ]; then
zenity --error --title "Dividir" \
--text "El tamaño del archivo debe ser mayor de 100 MB"
exit 1
fi

# Si todo ha ido bien nos vamos al directorio y dividimos el archivo
cd $dir
$tool --numeric-suffixes --suffix-length=3 \
--bytes=$trozo "$file" "$file."

Como puede observarse en el código y sus comentarios adjuntos, antes de invocar al comando split compruebo que está instalado y que el archivo a partir tiene un tamaño adecuado. Lo único que quizá merezca un comentario extra es el hecho de que los mensajes de error en este tipo de scripts hechos para nautilus-actions no se pueden mostrar con echo o printf ya que no hay consola, por lo que utilizo Zenity, un proyecto vinculado a GNOME que permite interactuar con el usuario usando cuadros de diálogo.

La combinación de los tres elementos: nautilus-actions, scripts en bash y Zenity permiten extender de forma relativamente sencilla las capacidades de Nautilus para hacerlo más potente y mejor adaptado a nuestras necesidades cotidianas. Y si una vez creadas nuestras extensiones, vemos la forma de compartirlas de manera más fácil (¿recuerdas ese botón Importar/Exportar en la utilidad de configuración?) pues mejor, ya que todos saldremos ganando ;-)