<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>El blog de Deigote &#187; bash</title>
	<atom:link href="http://blog.deigote.com/tag/bash/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.deigote.com</link>
	<description>El mundo de Deigote. Un diario de cualquier cosa que me resulte interesante (si a alguien más se lo resulta, es otro cantar). Espero que os guste o disguste. Incluso que os deje indiferentes sería una opción tan buena como cualquier otra.</description>
	<lastBuildDate>Thu, 07 Apr 2011 15:29:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Obtener las extensiones de fichero existentes en un directorio</title>
		<link>http://blog.deigote.com/2010/01/12/obtener-las-extensiones-fichero-existentes-en-un-directorio/</link>
		<comments>http://blog.deigote.com/2010/01/12/obtener-las-extensiones-fichero-existentes-en-un-directorio/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 17:56:40 +0000</pubDate>
		<dc:creator>Deigote</dc:creator>
				<category><![CDATA[Informática, internet y tecnología]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[find]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[sed]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://blog.deigote.com/?p=440</guid>
		<description><![CDATA[Cómo obtener la extensión de un fichero, o todas las extensiones que existan a partir de un directorio en bash o sh.]]></description>
			<content:encoded><![CDATA[<p>Una mini-receta rápida para obtener, de forma recursiva, todas las extensiones de fichero que existan a partir de un directorio dado:</p>
<p><code>find directorio_raiz -type f -exec sh -c 'basename $0 | sed "s/.*\.//"' {} \;  | sort | uniq</code></p>
<p>El truco viene del archipoderoso sed, que permite obtener las extensión de un fichero mediante la orden <em>sed &#8220;s/.*\.//&#8221;</em>, y funciona que yo sepa, para cualquier <em>Unix</em> con una shell compatible con <em>sh</em> y <em>find</em>, <em>basename</em> y <em>sed</em> instalados.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.deigote.com/2010/01/12/obtener-las-extensiones-fichero-existentes-en-un-directorio/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Programmed shutdown: pequeño script para apagar la máquina</title>
		<link>http://blog.deigote.com/2009/04/17/programmed-shutdown-pequeno-script-para-apagar-la-maquina/</link>
		<comments>http://blog.deigote.com/2009/04/17/programmed-shutdown-pequeno-script-para-apagar-la-maquina/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 09:09:30 +0000</pubDate>
		<dc:creator>Deigote</dc:creator>
				<category><![CDATA[Informática, internet y tecnología]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[poweroff]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[shutdown]]></category>
		<category><![CDATA[sleep]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[zenity]]></category>

		<guid isPermaLink="false">http://blog.deigote.com/?p=330</guid>
		<description><![CDATA[Después de buscar (no, mucho, eso si  ) por Google y no encontrar algo que se adaptase a mis mínimas necesidades, me he hecho un pequeño script de apagado de la máquina para mi maravilloso PC en el salón (que no de salón  ) equipado con un GNU/Linux (en concreto una Debian, pero [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignright" style="width: 260px"><a href="http://deigote.com/img/programmed-shutdown-cropped1.png"><img alt="Programmed shutdown: step 1" src="http://deigote.com/img/programmed-shutdown-cropped1.png" title="Paso 1: ¿cuánto tiempo?" width="250" /></a><p class="wp-caption-text">Paso 1: ¿cuánto tiempo?</p></div>
<p>Después de buscar (no, mucho, eso si <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':D' title=':D' class='wp-smiley smiley-2' /> ) por Google y no encontrar algo que se adaptase a mis mínimas necesidades, me he hecho un pequeño <em>script</em> de apagado de la máquina para mi maravilloso PC en el salón (que no de salón <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':)' title=':)' class='wp-smiley smiley-19' /> ) equipado con un GNU/Linux (en concreto una Debian, pero el script es multiversal dentro del mundo Linux <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':-P' title=':-P' class='wp-smiley smiley-15' /> y quizá Unix, depende de si el software zenity está en otras plataformas o no). </p>
<div class="wp-caption alignleft" style="width: 260px"><a href="http://deigote.com/img/programmed-shutdown-cropped2.png"><img alt="Programmed shutdown: step 2" src="http://deigote.com/img/programmed-shutdown-cropped2.png" title="Paso 2: tú tranqui, que ya te aviso yo..." width="250" /></a><p class="wp-caption-text">Paso 2: tú tranqui, que ya te aviso yo...</p></div>
<p>La idea es poder pedirle a la máquina que se apague dentro de equis minutos, con posilibidad de cancelarlo y cierto feedback visual de cuánto tiempo te queda. Posibles usos son por ejemplo imitar la función Sleep de algunas televisiones, o, cuando te vas de vacaciones y tienes algunas descargas tirando, o algún programa de TV que quieres que se grabe, pedirle que se apague en unos días para no consumir energía tontamente.</p>
<div style="clear:both; height:1em"></div>
<p>El script sólo requiere que esté instalado <a href="http://library.gnome.org/users/zenity/">Zenity</a>. El código fuente del mismo lo podéis ver a continuación:</p>
<pre><code>#!/bin/bash
# Ask for time in minutes to sleep and ater that poweroff the computer
# needs - zenity
# Diego Toharia - deigote@deigote.com

# Messages
TITLE="Apagar el ordenador"
MINUTES_QUESTION="¿Dentro de cuántos minutos?"
WAIT_PRE="Esperando"
WAIT_POST="minutos"

minutes=`zenity --entry --title "$TITLE" --text "$MINUTES_QUESTION" 2>&#038;1` || exit
seconds=`expr $minutes "*" 60`

if [ $seconds != "" ] ; then
	for i in `seq 1 $seconds` ; do
		percentage=`expr $i "*" 100`
		percentage=`expr $percentage "/" $seconds`
		echo $percentage
		sleep 1
	done | zenity --title="$TITLE" --text="$WAIT_PRE $minutes $WAIT_POST" --progress --auto-close --auto-kill
	poweroff
fi</code></pre>
<p>También quiero pensar que, si alguna vez cambio algo, podréis encontrar una versión actualizada en el enlace <a href="http://deigote.com/scripts/x-programmed-shutdown" title="Programmed shutdown">Programmed shutdown script</a> pero no garantizo que  cumpla mis propósitos  <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':-D' title=':-D' class='wp-smiley smiley-2' /> .</p>
<div class="wp-caption aligncenter" style="width: 500px"><a href="http://deigote.com/img/programmed-shutdown-cropped3.png"><img alt="Programmed shutdown: laucher" src="http://deigote.com/img/programmed-shutdown-cropped3.png" title="Lanzador del script" width="490" /></a><p class="wp-caption-text">Programmed shutdown: laucher</p></div>
<p>Para invocarlo, basta guardarlo en un directorio que esté en el <em>path</em> (yo suelo usar para estos scripts $HOME/bin) y darle permisos de ejecución. Recordar que debéis tener permisos para ejecutar el mandato poweoff. En mi caso, tengo en la barra inferior un lanzador precedido del mandato gksudo, de tal manera que el script se lanza con los permisos necesarios, pidiéndome la contraseña en caso necesario.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.deigote.com/2009/04/17/programmed-shutdown-pequeno-script-para-apagar-la-maquina/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Si la salida fuese un Excell, lo llamaríamos ingeniería del software</title>
		<link>http://blog.deigote.com/2008/12/11/si-la-salida-fuese-un-excell-lo-llamariamos-ingenieria-del-software/</link>
		<comments>http://blog.deigote.com/2008/12/11/si-la-salida-fuese-un-excell-lo-llamariamos-ingenieria-del-software/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 15:47:40 +0000</pubDate>
		<dc:creator>Deigote</dc:creator>
				<category><![CDATA[Informática, internet y tecnología]]></category>
		<category><![CDATA[awk]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[contador]]></category>
		<category><![CDATA[contador de lineas]]></category>
		<category><![CDATA[counter]]></category>
		<category><![CDATA[ingeniería]]></category>
		<category><![CDATA[line]]></category>
		<category><![CDATA[line counter]]></category>
		<category><![CDATA[lineas]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://blog.deigote.com/?p=273</guid>
		<description><![CDATA[Lo que ha empezado como un simple conteo de ficheros para ver qué proyecto hacía que Eclipse fuese lento, ha terminado en todo un contador de líneas digno de aparecer en cualquier libro de ingeniería del software (nótese la cursiva, por favor  ), si no fuera porque es un script de consola bash con [...]]]></description>
			<content:encoded><![CDATA[<p>Lo que ha empezado como un simple conteo de ficheros para ver qué proyecto hacía que <a title="Eclipse IDE" href="http://www.eclipse.org/">Eclipse</a> fuese lento, ha terminado en todo un contador de líneas digno de aparecer en cualquier libro de <em>ingeniería del software</em> (nótese la cursiva, por favor <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':???:' title=':???:' class='wp-smiley smiley-3' /> ), si no fuera porque es un script de consola bash con salida de texto simple.</p>
<p>Al grano:</p>
<pre><code>#!/bin/bash
EXTENSIONES="$@"
ficheros_total=0
lineas_total=0
vacias_total=0
novacias_total=0
for ext in $EXTENSIONES ; do
   echo EXTENSION $ext
   ficheros=`find . -name "*.$ext" | wc -l`
   lineas=`find . -name "*.$ext" | xargs cat | wc -l`
   novacias=`find . -name "*.$ext" | xargs cat | awk 'BEGIN { lineas = 0 } { if ($0 != "") lineas++} END { print lineas }'`
   vacias=`find . -name "*.$ext" | xargs cat | awk 'BEGIN { lineas = 0 } { if ($0 == "") lineas++} END { print lineas }'`
   porcentaje=`echo $vacias $lineas | awk '{ print $1 / $2 * 100 }'`
   echo Tiene $ficheros ficheros de tipo $ext y $lineas lineas, de las cuales $novacias tienen contenido y $vacias son vacias \(un $porcentaje %\)
   ficheros_total=`expr $ficheros_total + $ficheros`
   lineas_total=`expr $lineas_total + $lineas`
   vacias_total=`expr $vacias_total + $vacias`
   novacias_total=`expr $novacias_total + $novacias`
done
if [[ $# -gt 1 ]] ; then
   porcentaje_total=`echo $vacias_total $lineas_total | awk '{ print $1 / $2 * 100 }'`
   echo TOTAL
   echo Tiene $ficheros_total ficheros en total, con $lineas_total lineas, de las cuales $novacias_total tienen contenido y $vacias_total son vacias \(un $porcentaje_total %\)
fi
</code></pre>
<p>Ejemplo de uso (guardandolo en un fichero cuenta_lineas.sh accesible por el path y con los permisos adecuados):</p>
<pre><code>$ cd directorio_raiz_del_proyecto/ ; ./cuenta_lineas.sh java jsp xml
EXTENSION java
Tiene 388 ficheros de tipo java y 60035 lineas, de las cuales 47806 tienen contenido y 12230 son vacias (un 20.3714 %)
EXTENSION jsp
Tiene 792 ficheros de tipo jsp y 91354 lineas, de las cuales 75267 tienen contenido y 16088 son vacias (un 17.6106 %)
EXTENSION xml
Tiene 170 ficheros de tipo xml y 32282 lineas, de las cuales 30437 tienen contenido y 1846 son vacias (un 5.71836 %)
TOTAL
Tiene 1350 ficheros en total, con 183671 lineas, de las cuales 153510 tienen contenido y 30164 son vacias (un 16.4228 %)
</code></pre>
<p>Mola <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':mrgreen:' title=':mrgreen:' class='wp-smiley smiley-12' /> aunque <s>es mejorable sacando porcentajes</s> (ver abajo <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':-D' title=':-D' class='wp-smiley smiley-2' /> ), pero no he encontrado un mandato tipo expr que trabaje con floats <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':neutral:' title=':neutral:' class='wp-smiley smiley-13' /> (a ver si <a href="http://blog.deigote.com/2007/10/31/creando-ficheros-tipo-jar-de-java-en-unix-solo-clases/#comment-646">algún comentarista</a> me da el tip <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':-)' title=':-)' class='wp-smiley smiley-19' /> )</p>
<p><strong>EDITO</strong>: Ya se me ha ocurrido cómo hacer los porcentajes <a href="http://blog.deigote.com/2008/12/11/si-la-salida-fuese-un-excell-lo-llamariamos-ingenieria-del-software/#comment-1726">mientras contestaba</a> <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':lol:' title=':lol:' class='wp-smiley smiley-10' /> actualizado el código y la salida del mismo</p>
<p><strong>EDITO de nuevo</strong>: Si queréis <a href="http://blog.deigote.com/2008/12/11/si-la-salida-fuese-un-excell-lo-llamariamos-ingenieria-del-software/#comment-1496">añadir más filtros</a> a las lineas vacías, tal y como sugiere Kortatu (<em>que yo ya he barajado</em>), tendréis que cambiar la línea </p>
<pre><code>novacias=`find . -name "*.$ext" | xargs cat | awk 'BEGIN { lineas = 0 } { if ($0 != "") lineas++} END { print lineas }'`</code></pre>
<p>por</p>
<pre><code>novacias=`find . -name "*.$ext" | xargs cat | grep -v '^$' | grep -v '^\s*\}\s*$'  | grep -v '^\s*\*.**$' | grep -v '^\s*/\*\*.*$' | grep -v '^\s.//.*$'</code></pre>
<p>Útil para código de la familia Java :D. ¡Gracias!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.deigote.com/2008/12/11/si-la-salida-fuese-un-excell-lo-llamariamos-ingenieria-del-software/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Bucles en la terminal</title>
		<link>http://blog.deigote.com/2006/09/22/bucles-en-la-terminal/</link>
		<comments>http://blog.deigote.com/2006/09/22/bucles-en-la-terminal/#comments</comments>
		<pubDate>Fri, 22 Sep 2006 08:07:28 +0000</pubDate>
		<dc:creator>Deigote</dc:creator>
				<category><![CDATA[Informática, internet y tecnología]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[bucles]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[tcsh]]></category>
		<category><![CDATA[terminal]]></category>

		<guid isPermaLink="false">http://www.deigote.com/blog/2006/09/22/bucles-en-la-terminal/</guid>
		<description><![CDATA[Hace poco necesitaba yo borrar, en una estructura de directorios, todos los ficheros cuya extensión fuera .class. Estas tareas suelen ser un tedio, pero muy fáciles de solucionar si sabes un poco de shell scripting. El ejemplo es el siguiente:

 $ for i in `find . -name '*.class'` ; do echo "Borrando $i" ; rm [...]]]></description>
			<content:encoded><![CDATA[<p>Hace poco necesitaba yo borrar, en una estructura de directorios, todos los ficheros cuya extensión fuera <em>.class</em>. Estas tareas suelen ser un tedio, pero muy fáciles de solucionar si sabes un poco de <em>shell scripting</em>. El ejemplo es el siguiente:<br />
<br />
<code> $ for i in `find . -name '*.class'` ; do echo "Borrando $i" ; rm "$i" ; done </code><br />
Esto haría la magia en una terminal con intérprete de mandatos <em>bash</em>. Si usais <em>tcsh</em> como yo, la cosa es un poco distinta:<br />
<br />
<code> $ foreach i ( ` find . -name '*.class' ` )<br />
foreach? echo "Borrando $i"<br />
foreach? rm $i<br />
foreach?end<br />
</code><br />
Como se ve, en <em>tcsh</em> es un poco menos intuitivo, ya se sabe que para programar, <em>bash</em> es bastante mejor :-), pero el resultado es equivalente.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.deigote.com/2006/09/22/bucles-en-la-terminal/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Any to mp3</title>
		<link>http://blog.deigote.com/2005/09/06/any-to-mp3/</link>
		<comments>http://blog.deigote.com/2005/09/06/any-to-mp3/#comments</comments>
		<pubDate>Wed, 07 Sep 2005 00:37:00 +0000</pubDate>
		<dc:creator>Deigote</dc:creator>
				<category><![CDATA[Informática, internet y tecnología]]></category>
		<category><![CDATA[any2mp3]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[for]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mp3]]></category>
		<category><![CDATA[music]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[terminal]]></category>
		<category><![CDATA[wma]]></category>

		<guid isPermaLink="false">http://www.deigote.com/blog/?p=4</guid>
		<description><![CDATA[Un script que convierte cualquier archivo (wav, wma, avi, etc) a mp3]]></description>
			<content:encoded><![CDATA[<p>¡Bueno, pues aquí va la primera entrada :D! ¿Nunca os las habeis visto con los malditos archivos wma? Yo si, y debo decir que son odiosos, nada menos que de <a href="http://www.microsoft.com">Mocosoft</a>. Más que nada, no me gustan porque mi fabulosa radio no lee más que MP3. Asín que, con las mismas, he hecho un cutre script que convierte cualquier archivo de cualquier tipo que pueda leer mplayer (es decir, cualquiera :)) a formato mp3. Incluso se puede usar para extraer el sonido de un archivo de video cualquiera (un concierto, por ejemplo :)). Aquí os dejo el estupendo y citado script:</p>
<pre><code>
#!/bin/bash
# any2mp3 - Recives an extension and convert any file with this extension
#           to mp3 using mplayer and lame.
# Requirements - mplayer, lame.
# Diego Toharia - deigote@gmail.com

# Verify parameter
if [[ $# -ne 1 ]]
then
  echo "Error: first parameter (file extension to convert) missing"
  echo "Usage: `basename $0` "
  exit 1
fi
ext=$1

# Remove spaces
for i in *.$ext; do
  mv "$i" `echo $i | tr ' ' '_'` ;
done

# To wav with mplayer, to mp3 with lame.
for i in *.$ext ; do
  name="`basename "$i" ."$ext" | tr '_' ' '`.mp3"
  echo $name
  mplayer $i -ao pcm:file=scratch.$$.wav &amp;&amp; \  lame -h -V 7 scratch.$$.wav "$name" ;
done

# Remove scratch file
rm scratch.$$.wav
</code></pre>
<p>Por supuesto, sólo para <a href="http://www.linux.org">Linux</a>. ¿O que pensabais?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.deigote.com/2005/09/06/any-to-mp3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
