2008/06/17

Dividir ficheros en trozos

Trabajando con datos geográficos referentes a grandes extensiones de terreno es normal encontrarse con la necesidad de guardar ficheros de gran tamaño en un disco externo. Si este disco está formateado con FAT, sistema de ficheros que no admite ficheros de un mayores de 4GB de tamaño, tenemos un pequeño problema. Es común encontrarse con errores del tipo:
cp: writing `/media/EXT-HDD/mdt.asc': File too large
Lo mismo puede pasar al mandar un fichero grande a través de una cuenta de correo con restricciones en el peso de los adjuntos.

La solución que dividir el fichero, por ejemplo usando el comando, split:
$split -b1500m archivo.ext archivo.@

Con esta simple sentencia tengo mi archivo cortado en trozos de 1500 MB.
Para restituir el archivo original bastaría con hacer un cat:
$cat archivo.* > archivo.ext
       
   

2008/06/12

Descomprimir archivos ZIP

Normalmente descomprimir un zip en Ubuntu es muy sencillo; se pincha sobre el archivo comprimido, se abre automáticamente el programa File-Roller (que viene por defecto en los escritorios GNOME), selecciona el directorio de destino y listo.

Para descomprimir desde línea de comandos lo normal es usar el programa unzip.

Ejemplo de uso:
$unzip fichecho.zip -d destino
Otra alternativa es usar File-Roller directamente desde linea de comandos. Para el mismo caso que antes escribiríamos:
$file-roller -e destino -f fichecho.zip
Usar file-roller tiene la ventaja de que ofrece soporte para muchos formatos de compresión con la misma forma de comprimirlos/descomprimirlos. Además, mi experiencia personal es que file-roller es más fiable que unzip descomprimiendo grandes ficheros.

Formatos soportados a día de hoy por file-roller:
  • Zip (.zip)
  • Jar (.jar , .ear , .war)
  • Lha (.lzh)
  • Rar (.rar)
  • Zoo (.zoo)
  • Arj (.arj)
  • AR (.ar)
  • Paquetes Debian (.deb) (Read-only mode)
  • Paquetes RPM (.rpm) (Read-only mode)
  • 7-zip (.7z)
  • ISO (.iso) (Read-only mode)
  • Stuffit (.bin, .sit)
  • Ficheros gzip, bzip, bzip2, compress, lzo
  • ...y por supuesto, maneja ficheros tar
       
   

2008/06/10

Ejecutar programas externos desde python

ACTUALIZACIÓN: Si estás ejecutando muchas acciones interaccionando con otros programas en python puede ser interesante Fabric. Super recomendado!!!!


Existen muchas alternativas para ejecutar programas desde python.
Aquí dejo unos ejemplos:

import os
os.system('ls /home/')

Existen multiples variantes del comando os.exec(). Por ejemplo, ejecutar el programa indicado reemplazando el proceso actual:
os.execl('/bin/ls')

Lo mismo que antes, pero con un listado de parámetros (atención: recordad que la lista de argumentos empieza en 0, no en 1):
os.execl('/bin/ls', '/bin/ls', '-l', '-i')

Ejecuta el comando buscando en $PATH y reemplazando el proceso actual:
os.execlp('ls', 'ls', '-lisa')

Si lo que necesitas es crear un nuevo proceso primero:
if os.fork()==0:
    os.execlp('ls')
else:
    print 'Fork has failed!'

Y si queremos ver la salida del programa ejecutado:
import commands

a = commands.getstatusoutput('ls')

aList = a.split('\n')

En lugar de usar la opción de hacer un fork() y obtener un nuevo proceso que controlaremos con su PID, es recomendable usar el módulo subprocess y su clase Popen. Más sobre esto y otros temas relacionados en el aquí.
       
   

2008/06/06

Selección vertical en emacs

Emacs es un super editor para programadores. Es un poco complejo, al principio, y yo confieso que lo intenté usar en 2 ocasiones y decidí volver a editores "menos sofisticados". A día de hoy, soy un entusiasta de Emacs, pero no me enzarzaré en la guerra entre editores... Con los editores me pasa como con los GIS, uso muchos diferentes, según para qué cosa... aunque Emacs apunta a ser el "EDITOR" para todo. ¿Cuál será el GIS definitivo...?

Emacs tiene innumerables características y funciones. Hoy voy a comentar una bastante curiosa (no exclusiva de emacs): la selección vertical también llamada, block-selection, o rectangle selection.

En emacs, los rectángulos son zonas rectangulares definidas por dos columnas y dos filas cualesquiera. Esto permite, por ejemplo, copiar, pegar, borrar o insertar columnas de texto en cualquier parte, o realizar ciertas operaciones sobre el texto dentro del rectángulo.

Para definir la región o rectángulo sobre el que se va a aplicar el comando se pone una marca (C-space) en una esquina y el cursor en la esquina diagonalmente opuesta.


Una vez seleccionado se pueden realizar las acciones típicas sobre la región seleccionada intercalando 'r' en el comando:












Cortar (kill)C-x r k
Pegar (yank)C-x r y
Borrar (delete)C-x r d
Insertar espacio (open)C-x r o
Limpiar (clear)C-x r c
Insertar texto (string)C-x r t string RET

En el ejemplo, he usado un rectangle para copiar unas cotas de un MDE con formato xyz de manera muy rápida y visual: