Marcas de tiempo en el historial bash

Apunte rápido para que no se me olvide. De todos es conocido que cuando tecleas:

$ history

en la linea de comandos, se te muestra un listado con todos los comandos bash que hayas ejecutado hasta el momento. Pero, ¿a qué hora los ejecutaste? A veces esa información puede ser muy útil… El caso es que la marca de tiempo de ejecución de cada comando se guarda internamente en el historial, pero por defecto, no se muestra. ¡Ah! ¿Y cómo podemos mostrarla?

Fácil:

$ HISTTIMEFORMAT=’%F %T ‘
$ export HISTTIMEFORMAT
$ history

526 2009-06-11 00:06:04 man history
527 2009-06-11 00:06:42 man -a history
528 2009-06-11 00:09:51 HISTTIMEFORMAT=’%F %T ‘
529 2009-06-11 00:09:56 export HISTTIMEFORMAT
530 2009-06-11 00:10:08 history

¡tachaaaaaán!

Drag&Drop de Nautilus a terminal

Abro Nautilus. Me muevo en el sistema de carpetas hasta /una/carpeta/muy/pero/que/muy/larga/ y ahora me doy cuenta de que dentro de esa carpeta hay un archivo que quiero tratar desde consola. Una opción: abro la consola y tecleo la ruta entera:

$ cd /una/carpeta/muy/pero/que/muy/larga/

para empezar a trabajar. Otra sería hacer un copy&paste. Pero hay otra más rápida: drag & drop de la ruta, tal y como se muestra en el vídeo. Pequeños tips que ahorran unos cuantos segundos cada vez. Y ya se sabe que segundo a segundo…

Otra cosa que tengo que hacer es mejorar la calidad de los vídeos 🙂

Script de actualización automática de WordPress

Ayer salió una nueva versión de WordPress, la 2.6.2. ¡Oh, no! ¡Hay que actualizar! Lo dejo para mañana… ¡NO! Pero es que me da una pereza…. Ok, es el momento de hacer un script anti-pereza 🙂 La próxima vez que WordPress actualice, será ejecutar el script ¡y listo!

Estando en:
$ pwd
$DOCUMENT_ROOT/diariolinux.com/httpdocs

Creamos un fichero ./upgrade, con permisos de ejecución, y el siguiente contenido:

$ cat ./upgrade


#!/bin/bash
#
# descargar última versión de WordPress
wget http://wordpress.org/latest.tar.gz -P /tmp
pushd .
mkdir /tmp/upgradewp
dir=/tmp/upgradewp
back=`date +%d%m%Y_%H%M`
new=/tmp/latest.tar.gz
#
# copia de seguridad, por si acaso las actualización va mal...
tar -cvzf wordpress_$back.tgz * > /dev/null
mv wordpress_$back.tgz $dir
#
# mover los ficheros que NO quiero que sean machacados con nuevas versiones
mv .htaccess $dir
mv wp-content $dir
mv wp-config.php $dir
mv favicon.ico $dir
cp -R wp-content/uploads $dir
cp ./upgrade.sh $dir
#
# borrar los ficheros de la versión actual de WordPress
rm -rf *
#
# descomprimir la nueva versión
tar -xvzf $new -C . > /dev/null
mv wordpress/* .
rmdir wordpress
#
# recuperar ficheros especiales
cp $dir/.htaccess .
cp -R $dir/wp-content .
cp $dir/wp-config.php .
cp $dir/upgrade.sh .
cp $dir/favicon.ico .
cp -R wp-content/uploads wp-content/uploads
#
# elige tus permisos
# chmod -R XXX wp-content

¡Ojo! No me responsabilizo de posibles pérdidas de datos. Así que si vas a ejecutar el script que indico, mejor haz primero una prueba en tu máquina local, y asegúrate de que te va a funcionar perfectamente. A mí me funciona, pero YMMV.

Automatizar la descarga de enlaces que cumplan patrón

Quiero descargar todos los enlaces de la página http://packages.medibuntu.org/pool/non-free/f/ffmpeg-debian/ que contengan i386 en el nombre. Por supuesto, de forma automática (si repites más de 2 veces el mismo gesto, y crees que en el futuro lo volverás a hacer, hay que automatizar):

juanan@morton:/tmp/fmpeg$ lynx -nonumbers  -dump http://packages.medibuntu.org/pool/non-free/f/ffmpeg-debian/| grep i386  | sed -e ‘s/^ *//’  | awk ‘{print $3}’ | wget -B «http://packages.medibuntu.org/pool/non-free/f/ffmpeg-debian/» -i –

lynx: navegador en modo texto

-dump : interpretar el HTML de la página y devolverlo por salida estándar

-nonumbers: mostrar los enlaces sin numerar

sed -e ‘s/^ *//’  : left trim  (recortar espacios en blanco, por la izquierda)

awk ‘{print $3}’ : quedarme con la tercera columna

wget -B URL   : URL base desde la que descargar

-i  –  : -i indica que le vamos a pasar un fichero a wget con las URLs de lo que queremos descargar. Como el filtro ya lo hemos hecho, y lo hemos enganchado a wget por un pipe, el fichero en sí no existe, sino que llega por tanto por entrada estándar (a través del pipe). Receta que usaré en más de una ocasión.

Matar todos los procesos de un tiro (y II)

Por aclamación popular 🙂 Estas tres líneas de comandos son equivalentes, todas ellas buscan procesos en cuyo nombre (o argumentos) contengan el string «cadena» y los mata. Para ser sinceros, no conocía pkill, y al parecer es exactamente el comando que resume todo este post. Es genial tener una base de lectores expertos que enseguida muestran la mejor solución al problema 🙂

$ kill -9 `ps -ef | grep -i cadena | awk {’print $2′}`
$ pgrep cadena | xargs kill -9
$ pkill -9 cadena

Finalmente, también se ha nombrado killall, pero para buscar los procesos a matar, sólo se basa en el nombre del ejecutable, y no puedes decirle que mate «cualquier proceso en cuyos argumentos aparezca la cadena X», por ejemplo.