Hiparco

Recetas y trucos de GNU/Linux e informática en general

Alojado en http://guimi.net

Copia de sistemas, clonado de discos

Para copiar sistemas hay muchas herramientas disponibles: g4l, partimage, ntfsclone… y por supuesto el viejo y confiable tar.
Veamos unas chuletas rápidas que pueden ayudarnos. Lógicamente hay que ajustar los nombres de los discos y las particiones.

Copia del MBR y la tabla de particiones
Para copiar el MBR y la tabla de particiones de un disco usamos dd y sfdisk.
MBR:
# dd if=/dev/sda of=sda.mbr count=1 bs=512
Tabla de particiones
# sfdisk -d /dev/sda > sda.sf

Para recuperarlos.
MBR:
# dd if=sda.mbr of=/dev/sda
Tabla de particiones
# sfdisk /dev/sda < sda.sf

Para clonar discos NTFS (Windows), usamos ntfsclone
Esta herramienta (ntfsclone) no permite volcar una imagen de una partición en otra partición más pequeña, aunque los datos quepan. En cambio volcar una partición pequeña en una más grande sí es posible.
Por ello se recomienda que la partición original sea lo más pequeña posible. Lo más cómodo es instalar en una partición grande y después redimensionarla antes de hacer la imagen.
# ntfsclone -s -o – /dev/sda1 | gzip | split -b 1500m – sda1.ntfsclone.gz.

Para recuperar la partición usamos:
# cat sda1.ntfsclone.gz.aa sda1.ntfsclone.gz.ab | gunzip -c | ntfsclone –restore-image –overwrite /dev/sda1 -

Para copiar datos de un sistema GNU/Linux a otro, mediante ssh+tar
Desde el equipo en el que vamos a volcar los datos (usamos p para preservar los permisos):
$ ssh IP_equipo_origen “tar cpf – /path_a_copiar” | tar xpf -

Si la red en que trabajamos es lenta (por ejemplo a través de internet) podemos comprimir los datos antes de enviarlos, podemos cambiar el directorio en que se copian los datos…:
$ ssh IP_equipo_origen “tar czpf – /path_a_copiar” | tar xzpf – -C /nuevo_path_base

También podríamos volcar los datos a un fichero:
$ ssh IP_equipo_origen “tar czpf – /path_a_copiar” | dd of=copia_datos.tar.gz
O en el sentido contrario:
$ tar czpf – /path_a_copiar | ssh IP_equipo_destino “dd of=copia_datos.tar.gz”

Más opciones con
$ man tar
$ man ssh

Trabajar con imágenes de particiones
$ partimage
Sí, ya está, solo eso.
Se pueden ver más opciones para evitar el asistente, como siempre mediante:
$ man partimage

tar, ssh, partimage, ntfsclone, dd, clonado, copia

Generar (diff) y aplicar (patch) parches

Hay manuales muy buenos sobre cómo generar parches… este no es uno de ellos, pero es una guía rápida para el 90% de casos.

Para los ejemplos suponemos que tenemos ficheros originales en una carpeta “original” y ficheros modificados en una carpeta “new”.

Trabajando con ficheros
Primero veremos como parchear un único fichero. Usamos el formato unificado (-u). Es el mejor pero “solo” sirve para entornos GNU, es decir todos los Linux y muchos UNIX.
diff -u original/foo.txt new/foo.txt > foo.patch

Podemos ver el parche generado con:
less foo.patch
La sintaxis es (línea o rango de líneas)(orden)(línea o rango de líneas)
Orden puede ser:
c – change – sustituir unas líneas por otras
a – add – añadir líneas
d -delete – borrar líneas

Para aplicar el parche podemos hacer (nombre de fichero implícito en el parche):
patch < foo.patch
O más seguro
patch bar.txt < foo.patch

Si queremos revertir un parche, porque detectamos que introduce un bug pero que el que corrige, por ejemplo, podemos hacer:
patch -R < foo.patch

Trabajando con directorios
Si modificamos varios ficheros, trabajamos con los directorios.
Generamos el parche con:
diff -rupN original/ new/ > codigo.patch

Lo aplicamos con:
patch -p1 < codigo.patch

Para más información, como siempre:
$ man diff
$ man patch

Trabajando con github.com
Los commits de Github pueden bajarse como parches añadiendo “.patch” al URL.
Así bastaría con:
$ wget github.com/URL_COMMIT.patch
$ patch -p1 < URL_COMMIT.patch

diff, patch, parche

Red con IP estática

Cada día hay más automatismos… y ya casi se nos olvida como hacer las cosas por nosotros mismos.
Para configurar una IP estática hacemos lo que indica el manual de Debian:
Primero configuramos la interfaz (en el ejemplo eth0 con la IP 192.168.11.100).
# vi /etc/network/interfaces
allow-hotplug eth0
iface eth0 inet static
address 192.168.11.100
netmask 255.255.255.0
broadcast 192.168.11.255
gateway 192.168.11.1
dns-domain lan
dns-nameservers 192.168.11.1

Después los DNSs, si no está instalado resolvconf, basta con:
# vi /etc/resolv.conf
domain localdomain
search localdomain
nameserver 192.168.1.1

Si está instalado resolvconf (y ante la duda no está de más):
# vi /etc/resolvconf/resolv.conf.d/base
nameserver 192.168.1.1

Tumbamos y levantamos la interfaz…
# ifdown eth0
# ifup eth0

¡Y ya está!

static ip, ip estática, red estática

Script para procesar fotos

Tras varios apuntes sobre como trabajar con fotos, pongo aquí el script completo que yo utilizo:

#!/bin/bash
#
# procesa_fotos.sh
# Por Guimi 2009/08 - http://www.guimi.net
#
# Ult. modificacion 2013/03 - http://guimi.net
#
# REQUIERE exif y jhead

####################################
#### ERRORES
E_NOPARAM=64        # Bad number of params

##########################
# PARAMETROS
DIR="./procesadas"

mkdir $DIR

echo "Renombrando videos..."
# Los ficheros .mov son peliculas que tienen asociado
# un fichero .jpg con el mismo nombre
for x in `ls *.mov 2> /dev/null`
do
	# Primero tomamos el directorio, el nombre y la extension
	#directorio=$(dirname "$x")
	nombre_fichero=$(basename "$x")
	#extension="${nombre_fichero##*.}"
	nombre_fichero="${nombre_fichero%.*}"

	# Comprobamos si existe el mismo fichero con extension jpg
	# En algunas camaras se llama .thm pero NO tiene cabecera exif
	if [ -f $nombre_fichero.jpg ]
	then
		# Tomamos la fecha, hora, minuto y segundo de la cabecera exif
		momento=`exif -t 0x9003 -m $nombre_fichero.jpg`
		nuevo_nombre="${momento:0:4}${momento:5:2}${momento:8:2}-${momento:11:2}${momento:14:2}${momento:17:2}"

		# Renombramos el fichero mov
		cp $x $DIR/$nuevo_nombre.mov
	else
		# Copiamos el fichero mov
		cp $x $DIR
	fi
done

# Los ficheros .mov son peliculas que tienen asociado
# un fichero .jpg con el mismo nombre
for x in `ls *.MOV 2> /dev/null`
do
	# Primero tomamos el directorio, el nombre y la extension
	#directorio=$(dirname "$x")
	nombre_fichero=$(basename "$x")
	#extension="${nombre_fichero##*.}"
	nombre_fichero="${nombre_fichero%.*}"

	# Comprobamos si existe el mismo fichero con extension jpg
	# En algunas camaras se llama .thm pero NO tiene cabecera exif
	if [ -f $nombre_fichero.JPG ]
	then
		# Tomamos la fecha, hora, minuto y segundo de la cabecera exif
		momento=`exif -t 0x9003 -m $nombre_fichero.JPG`
		nuevo_nombre="${momento:0:4}${momento:5:2}${momento:8:2}-${momento:11:2}${momento:14:2}${momento:17:2}"

		# Renombramos el fichero mov
		cp $x $DIR/$nuevo_nombre.mov
	else
		# Copiamos el fichero mov
		cp $x $DIR
	fi
done

echo "Renombrando fotos..."
# Copiamos las fotos al directorio de trabajo
cp *.jpg $DIR
cp *.JPG $DIR
# Nos movemos al directorio de trabajo
cd $DIR
# Renombramos ficheros y los rotamos si es menester
jhead -autorot -n%Y%m%d-%H%M%S *.jpg > /dev/null
jhead -autorot -n%Y%m%d-%H%M%S *.JPG > /dev/null
#jhead -n%Y%m%d-%H%M%S *.jpg
 

Convertir archivos Open XML (DOCX) a Open Document Format (ODF) y viceversa

Antes o después nos encontramos con el momento desagradable en que nos envían un documento en el formato “Open XML”, un formato cerrado de Microsoft que utiliza a partir de Office 2007 (archivos docx, xlsx, pptx…).

En este caso lo primero que hay que hacer es explicar al remitente que es mejor no utilizar esa engañifa y solicitarle de nuevo el documento en otro formato. Una opción es instalar odf-converter en Windows que permite a Microsoft Office guardar documentos en ODF.

Lo segundo, si lo primero falla, es convertir el documento al formato estándar y abierto ODF, mediante una herramienta en línea de comandos de Go-OO.org basada siempre en odf-converter (la pista es de OOONinja).

Para ello descargamos el fichero rpm desde el repositorio de go-oo.org.
$ wget http://download.go-oo.org/tstnvl/odf-converter/RPMS/i586/odf-converter-3.0.5273-1.i586.rpm

Instalamos herramientas necesarias:
$ sudo aptitude install rpm libgif4

Extraemos los ficheros, bien mediante el gestor de archivadores (doble click sobre el rpm), bien mediante:
$ rpm2cpio odf-converter*rpm | cpio -ivd

Y copiamos los binarios:
$ sudo cp usr/lib/ooo-2.0/program/OdfConverter /usr/bin/odfconverter-2.0
$ sudo cp usr/lib/ooo3/program/OdfConverter /usr/bin/odfconverter-3

El uso es muy sencillo. Por ejemplo para convertir un fichero XLSX hacemos:
$ odfconverter-2.0 fichero.xlsx
Y nos genera (tarda un poco) fichero.ods.

También se puede utilizar para convertir ficheros ODF a DOCX, pero no veo el interés o beneficio. En un momento dado es mejor convertir al formato anterior de Microsoft (doc, xls, ppt…).

ODF, DOCX, Open XML, convertir

Ordenar archivos en sistemas de ficheros FAT

El sistema de ficheros FAT es uno de lo más antiguos todavía en uso. Su actual popularidad se debe a que la mayoría de teléfonos móviles, lectores de MP3, cámaras de fotos, radios, etc. solo reconocen este sistema, por lo que las memorias USB, las tarjetas SD, MMC, etc. vienen formateadas con FAT.

El problema es que estos dispositivos no suelen ordenar los ficheros y directorios que encuentran, sino que muesrtan los archivos tal y como están grabados. Esto hace que muchas veces, tras pasar varias horas ordenando tu colección de música, molestándote en ponerles nombres tipo “01-titulo-artista.mp3″ y demás, te encuentras con que el reproductor lista las canciones aleatoriamente.

Para evitar esto basta con “ordenar” los ficheros en el sistema FAT. En GNU/Linux, como es habitual, es muy sencillo hacerlo (el dispositivo debe estar desmontado):
sudo fatsort (dispositivo)

Para que esto funcione bien, primero hay que instalar fatsort, lo que a su vez tambien es muy sencillo:
sudo aptitude install fatsort
Se puede obtener información sobre la patición con:
sudo fatsort -i (dispositivo)

FAT, sort, fatsort, ordenar ficheros, sort files

Retocar videos

Para pasar vídeos en formato 3gp, habitual en algunos teléfonos móviles, al más estándar avi podemos hacer:
$ ffmpeg -i videoIn.3gp -f avi -vcodec xvid -acodec mp3 -ar 22050 videoOut.avi

Y al contrario para pasar vídeos a formato 3gp, por ejemplo desde flv, típico de internet:
$ ffmpeg -i videoIn.flv -vcodec libx264 -acodec libfaac videoOut.3gp

También nos puede interesar pasar archivos flv a avi:
$ ffmpeg -i input.flv -vcodec libxvid -acodec copy output.avi

Para rotar vídeos que hemos grabado con cámaras de fotos en modo vertical, en vez de horizontal, podemos hacer:
$ mencoder -vf rotate=1 videoIn.avi -oac mp3lame -ovc lavc -o videoOut.avi
o bien:
$ mencoder -vf rotate=1,hqdn3d,eq=25:50 -oac pcm -ovc lavc videoIn.avi -o videoOut.avi
Si además queremos añadir bandas negras a los lados para que el vídeo resultante mantenga las proporciones de imagen de los vídeos horizontales podemos hacer:
$ mencoder -vf rotate=2,expand=-176:0:88:0 -oac pcm -ovc lavc videoIn.mov -o videoOut.avi

video, mencoder, ffmpeg

PDF Editor

Recientemente he descubierto “PDF Editor”, un programa GPL para GNU/Linux que permite editar PDFs.
Hasta ahora me limitaba a trabajar con pdfs desde el prompt o incluso con GIMP.
PDF Editor no es que funcione maravillosamente, aún está un poco verde, da algunos errores de funcionamiento… pero al final sirve para lo que promete: editar ficheros PDFs.
Funciona en modo gráfico y comando y además está en los repositorios de Debian, Ubuntu…
$ sudo aptitude install pdfedit

PDF Editor, PDF, pdfedit

Renombrar fotos en base a la fecha de la cabecera Exif

Para renombrar fotos poniéndoles la fecha en que se realizaron podemos usar el siguiente comando:
$ jhead -n%Y%m%d-%H%M%S *.jpg

p1020288.jpg --> 20090628-155508.jpg
p1020289.jpg --> 20090628-155558.jpg

Podemos, mejorar el comando con:
$ jhead -autorot -n%Y%m%d-%H%M%S *.jpg

p1020288.jpg --> 20090628-155508.jpg
p1020289.jpg --> 20090628-155558.jpg

La opción -autorot rota automáticamente las fotos para que se vean todas correctamente.

Otro más sencillo para consultar las cabeceras exif es “exif“, “jhead” sirve principalmente para modificar las cabeceras.
 

exif, jhead, prompt, fotos, jpg, imágenes