Posts Tagged ‘script’

Script: Crear listas de reproducción m3u

Posted in Scripts, linux on April 12th, 2009 by mrcomputer – 6 Comments

Los archivos M3U son un tipo de archivos que sirven para almacenar listas de reproducción de archivos multimedia, y principalmente usado para listas de reproducción de audio. Estos archivos son reconocidos por la mayoría de reproductores en todos los sistemas operativos, como pueden se XMMS, VLC, Winamp, etc.

Los archivos M3U son archivos de texto plano con extensión .m3u y con una sintaxis muy sencilla.

En la primera línea de un archivo M3U siempre tiene que estar la sentencia #EXTM3U, que es lo que indica que se trata de un fichero M3U. Posteriormente se introducen en cada línea se introduce la ruta(relativa o absoluta) de los archivos multimedia que conformarán la lista de reproducción. Existen otras sentencias, pero son optativas y sirven para indicar el tiempo del archivo y el titulo en texto claro.

Como podéis ver es muy sencillo crear archivos de listas de reproducción M3U, también es muy sencillo ocultar datos en estos archivos, pero de esto hablaré en un próximo post.

Pues bien, a continuación teneis un sencillo script de bash que crea una lista de reproducción con los archivos mp3 y ogg que se encuentren en el directorio actual y recursivamente en todos los subsiguientes. También si descomentas una linea podrás agregar los archivos wav, pero la he comentado porque no es tan común tener música en .wav.

#!/bin/bash
##################################################################################
#       Script para crear archivos m3u con los arhivos a partir  del
#                               directorio actual
#               Creado por Miguel Peris(mrcomputer) version 1.0 11/04/2009
#       Uso: ./m3.sh nombre_de_la_lista.m3u
#             Sin parametros genera un nombre de lista por defecto
#       Licenciado bajo los terminos de la licencia GPL v3
##################################################################################
 
if [ -z $1 ]; then
archivo="lst-$(basename $PWD).m3u"
else
archivo=$1
fi
echo $archivo
 
# cabecera del archivo m3u y si el archivo existe lo borra
echo "#EXTM3U">$archivo
 
# genera listas para mp3 y ogg
ls -1R |find . -type f -print| grep -i .mp3 >>$archivo
ls -1R |find . -type f -print|  grep -i .ogg >>$archivo
 
# Descomentar la siguiente linea para tambien introducir los .wav a la lista
#ls -1R |find . -type f -print|  grep -i .wav >>$archivo
 
#EOF

Ahora solo hay que guardarlo como m3.sh y darle permisos de ejecución con chmod +x m3.sh. Si lo ejecutas sin parámetros el nombre de la lista de reproducción será lst-<directorio_actual>.m3u, por ejemplo si el directorio que nos encontramos se llama musica, el archivo m3u que genera el script por defecto será lst-musica.m3u.

En cambio si por parámetros le pasamos un nombre, generará la lista con ese nombre. Por ejemplo si ejecutamos nuestro script así, ./m3u.sh mi_lista.m3u generará el archivo mi_lista.m3u. También si queremos podemos pasarle el nombre con la ruta(absoluta o relativa) de la lista.

Espero que a alguien le sea de utilidad este pequeño script.

Script: tic-tac-toe (tres en raya)

Posted in Scripts, linux on April 5th, 2009 by mrcomputer – 2 Comments

Este clásico juego de mesa, que ha jugado un papel muy importante en algunas peliculas, también se puede hacer con bash.

Solo tenéis que guardar este código en un archivo llamado ttt.sh o bajarlo desde aquí y darle privilegios de ejecución con chmod +x ttt.sh. Ya podrás ejecutarlo con ./ttt.sh y jugar a este juego.

#!/bin/bash
# Sat Jul 12 16:52:30 EDT 2003
# NAME: ttt
# Copyright 2003, Chris F.A. Johnson
# Released under the terms of the GNU General Public License
 
ESC=$'\e'
 
tictactoe() {
[ $verbose -ge 1 ] &amp;&amp; echo tictactoe $* &gt;&amp;2
    board=`printf "%9.9s" "        "`
    mvnum=1
    remainder=" 1 2 3 4 5 6 7 8 9 "
    show "$board"
    while :
    do
      status
      eval \$player$P
      [ $? -ne 0 ] &amp;&amp; return
      put $_MOVE "$board"
      board=$_PUT
#      show "$board"
      mkbold "$_MOVE"
      printat 0 0 $mvnum
      printat $prompt
      sleep $pause &amp;
      mlist="$mlist $_MOVE"
      remainder=${remainder/ $_MOVE / }
 
      checkboard "$board" &amp;&amp; {
	  mkbold $win
	  printat $prompt "$cle"
	  eval winner \$player$P
	  return
      }
 
      [ $mvnum -eq 9 ] &amp;&amp; {
	  B=$U mkbold "$_MOVE"
	  winner "Neither player"
	  return
      }
      wait
      B=$U mkbold "$_MOVE"
      if [ $P = O ]
      then
	  P=X
	  OP=O
      else
	  P=O
          OP=X
      fi
      mvnum=$(( $mvnum + 1 ))
    done
}
 
winner() {
[ $verbose -ge 1 ] &amp;&amp; echo winner $* &gt;&amp;2
     printat $prompt "$cle $* wins\n\n"
}
 
status() {
[ $verbose -ge 1 ] &amp;&amp; echo status $* &gt;&amp;2
    if [ $verbose -ge 1 ]
    then
	printat 4 0
	printf "${cle}Move: %s Player: %s Board: \"%s\"  Last move: %s  Move list: %s" \
	    "$mvnum" "$P" "${board// /-}" "$_MOVE" "$mlist"
    else
	false
    fi
}
 
show() {
[ $verbose -ge 1 ] &amp;&amp; echo show $* &gt;&amp;2
    printat 0 0 $mvnum
    printat 0 $top  ##$(( ($LINES - 5) / 2 ))
    printf "  %${margin}.${margin}s | %1s | %1s\n" "${1:0:1}" "${1:1:1}" "${1:2:1}"
    printf "%${margin}.${margin}s---+---+---\n" " "
    printf "  %${margin}.${margin}s | %1s | %1s\n" "${1:3:1}" "${1:4:1}" "${1:5:1}"
    printf "%${margin}.${margin}s---+---+---\n" " "
    printf "  %${margin}.${margin}s | %1s | %1s\n" "${1:6:1}" "${1:7:1}" "${1:8:1}"
}
 
put() {
[ $verbose -ge 1 ] &amp;&amp; echo put $1 \""$2"\" &gt;&amp;2
   local n=$(( $1 - 1 ))
   _PUT=${2:-$board}
   [ "${_PUT:$n:1}" = " " ] &amp;&amp;
            _PUT=${_PUT:0:$n}$P${_PUT:$1}
}
 
checkboard() {
[ $verbose -ge 1 ] &amp;&amp; echo checkboard \"$*\" &gt;&amp;2
    case $1 in
	$P??$P??$P??) win="1 4 7" ;;
	?$P??$P??$P?) win="2 5 8" ;;
	??$P??$P??$P) win="3 6 9" ;;
	??$P?$P?$P??) win="3 5 7" ;;
        $P???$P???$P) win="1 5 9" ;;
	$P$P$P??????) win="1 2 3" ;;
	???$P$P$P???) win="4 5 6" ;;
	??????$P$P$P) win="7 8 9" ;;
        *) false ;;
    esac
}
 
mkbold() {
[ $verbose -ge 1 ] &amp;&amp; echo mkbold $* &gt;&amp;2
  for sq in $*
  do
    row=$(( ($sq - 1) / 3 ))
    col=$(( ($sq - 1) % 3 + 1 ))
    printat $(( ($col * 4) + $margin - 2 )) $(( ($row * 2) + $top ))
    printf "${B}$P${U}"
  done
}
 
human() {
[ $verbose -ge 1 ] &amp;&amp; echo human $* &gt;&amp;2
   while :
   do
       key "Select ($remainder)"
#       case $_MOVE in
#	  "$ESC") read -sn1; read -sn1 kp; continue ;;
#       esac
       _MOVE=$_KEY
       case $_MOVE in
	   1|2|3|4|5|6|7|8|9) [ "${board:_MOVE-1:1}" = " " ] &amp;&amp; break ;;
	   q|Q|x|X) echo; return 5 ;;
	   p) printat $prompt
	      KEYECHO= KEYMAX=$(( $COLUMNS - 10 )) key "Enter delay in seconds"
	      pause=$_KEY
	      ;;
	   "") set -- $remainder
	       _MOVE=$1
	       [ $verbose -ge 1 ] &amp;&amp; echo "|$_MOVE|" &gt;&amp;2
	       break ;;
	   *) printat $prompt
	      printf "\r%s%s\r" "  "$cle" $_MOVE: Invalid move"
	      sleep 1
	      printf "%s\r" "$cle" ;;
       esac
   done
}
 
randy() {
[ $verbose -ge 1 ] &amp;&amp; echo randy $* &gt;&amp;2
    randstr $remainder
    _MOVE=$_RANDSTR
}
 
key() {
[ $verbose -ge 1 ] &amp;&amp; echo key $* &gt;&amp;2
    printat $prompt "$cle$CVIS$beep"
    read -${KEYECHO}n$KEYMAX -p "${1:-PAK}: " _KEY 2&gt;&amp;1
    printf "$CINV"
}
 
getkey() {
    local OKchars=${1:-${remainder// /}}
    local kp2 kp3
    stty -echo
    while :
      do
      prompt="==&gt;"
      prompt
      IFS= read -r -sn1 -p " " kp 2&gt;&amp;1 || exit 2 #cleanup
      case $OKchars in
          *"$kp"*)
              case $kp in
                  $ESC)
                      read -st1 -n1 kp2
                      case $kp2 in
                          \[) read -st1 -n1 kp3
                              case $kp3 in
                                  A) kp=$UP; break ;;
                                  B) kp=$DN; break ;;
                                  C) kp=$RT; break ;;
                                  D) kp=$LF; break ;;
                              esac
                              ;;
                       esac
                       ;;
                  *) break ;;
              esac
              ;;
       esac
    done
    _KEY=$kp
}
 
randstr() {
[ $verbose -ge 1 ] &amp;&amp; echo randstr $* &gt;&amp;2
#    [ -n "$1" ] || return 1
    n=$(( ($RANDOM % $#) + 1 ))
    eval _RANDSTR=\${$n}
}
 
isblock() {
[ $verbose -ge 1 ] &amp;&amp; echo isblock $* &gt;&amp;2
    win=
    block=
    for _MOVE in $remainder
    do
        P=$OP put $_MOVE
	P=$OP checkboard "$_PUT" &amp;&amp; return
    done
    _MOVE=
}
 
block() {
[ $verbose -ge 1 ] &amp;&amp; echo block $* &gt;&amp;2
    block=
    for _MOVE in $remainder
    do
        put $_MOVE
	checkboard "$_PUT" &amp;&amp; return
        P=$OP put $_MOVE
	P=$OP checkboard "$_PUT" &amp;&amp; block=$_MOVE
    done
    [ "$block" ] &amp;&amp; { _MOVE=$block; return; }
    randy
}
 
computer() {
[ $verbose -ge 1 ] &amp;&amp; echo computer $* &gt;&amp;2
   local r c
   case $mvnum in
       1) randstr 1 3 7 9
	  _MOVE=$_RANDSTR ;;
       2)
	   if [ "${board:4:1}" = " " ]
	   then
	       _MOVE=5
	   else
	       randstr 1 3 7 9
	       _MOVE=$_RANDSTR
	   fi
	   ;;
       3)  r=${mlist// /}
	   c='1 3 7 9'
	   randstr ${c//[$r]/}
#	   randstr ${remainder//[$r]/}
	   _MOVE=$_RANDSTR
	   ;;
       4)
	   isblock
	   [ "$_MOVE" ] &amp;&amp; return
	    r=${mlist// /}
	    c='2 4 6 8'
	    randstr ${remainder//[$r]/}
	    _MOVE=$_RANDSTR
	    ;;
       *) block ;;
   esac
}
 
printat() { #== print arguments 3-... at Y=$2 X=$1
[ $verbose -ge 1 ] &amp;&amp; echo printat $* &gt;&amp;2
    [ $# -lt 2 ] &amp;&amp; return 1
    local y=$2
    local x=$1
    shift 2
    msg="$*"
    printf "\e[%d;%dH%b" $y $x "$msg"
}
 
version()
{
    echo "    $progname, version $version
    Copyright $copyright, $author $email
    This is free software, released under the terms of the GNU General
    Public License.  There is NO warranty; not even for MERCHANTABILITY or
    FITNESS FOR A PARTICULAR PURPOSE.
"
}
 
usage()
{
echo "
    ${B}NAME${U}:  $progname - Tic-Tac-Toe
 
    ${B}USAGE${U}: $progname [OPTIONS]
 
    ${B}OPTIONS${U}:
 
        -x player1         - specify first player
        -o player2         - specify second player
        -c player1,player2 - specify both players
        -p seconds         - time to pause between moves
 
        -h, --help       - help: print this message
        -H, --help_long  - help: print more detailed message (if available)
        -v, --verbose    - sends messsages to \$HOME/tttlog
        -V, --version    - print version information
 
    Copyright 2003, Chris F.A. Johnson
"
}
 
verbose=0
longusage=0
version="1.0"
copyright=2003
author="Chris F.A. Johnson"
progname=${0##*/}
P=X
OP=O
 
playerX=human
playerO=computer
co=
li=
 
if tput ce &gt;/dev/null 2&gt;&amp;1
then ## e.g. FreeBSD
    co=co
    li=li
elif tput el 2&gt;/dev/null
then ## e.g. Linux
    co=cols
    li=lines
fi
 
UNBOLD=$'\E[0m'
standout=$'\E[0;1;7m'
cle=$'\E[K'
clb=$'\E[1K'
ULINE=$'\E[0;4m'
REVERSE=$'\E[0;7m'
BLINK=$'\E[0;5m'
BOLD=$'\E[0;1m'
CINV=$'\E[0;8m'
 
R=$REVERSE
U=$UNBOLD
B=$BOLD
BR=$B$R
Cl=$'\f'
if [ "$co" ]
then
    tput reset
    COLUMNS=${COLUMNS:=`tput $co`}
else
    COLUMNS=${COLUMNS:-80}
fi
top=6
margin=11
prompt="3 $(( $top + 9 ))"
beep=  #$'\a'
pause=1
KEYMAX=1
KEYECHO=s
 
while getopts vVhH-:xoX:O:c:p: var
do
 case "$var" in
 
     x) playerX=human
	playerO-computer
	;;
     o) playerO=human
	playerX=computer
	;;
     X) playerX=$OPTARG ;;
     O) playerO=$OPTARG ;;
     c|C) playerO=${OPTARG#*,}
	  playerX=${OPTARG%,*}
	  ;;
     p) pause=$OPTARG ;;
 
    -) case $OPTARG in
         help) usage; exit ;;
         verbose) verbose=$(( $verbose + 1 )) ;;
         version) version; exit ;;
       esac
       ;;
    h) usage; exit ;;
    H) longusage=1; usage; exit ;;
    v) verbose=$(( $verbose + 1 )) ;;
    V) version; exit ;;
    *);;
 esac
done
shift $(( $OPTIND - 1 ))
 
if [ "$co" ]
then
    COLUMNS=`tput $co`
else
    COLUMNS=${COLUMNS:-80}
fi
margin=11  ##$(( ($COLUMNS - 11) / 2 ))
clear
 
if [ $verbose -ge 1 ]
then
    exec 2&gt;$HOME/tttlog
    set -x
fi
 
tictactoe
printat $prompt "\n$CVIS\n"

Fuente: http://cfaj.freeshell.org/shell/scripts/ttt-sh.html

Script: prefijos telefónicos españoles

Posted in Scripts, linux on March 7th, 2009 by mrcomputer – Be the first to comment

He encontrado este pequeño script que puede resultar útil cuando te llaman de un numero de fuera de tu comunidad y no reconoces el prefijo. El script de bash te pide el numero de teléfono y te da los los datos relativos a la provincia, ciudad, operadora y fecha de asignación.

Solo tienes que descargar este archivo, descomprimirlo y darle permisos de ejecución con chmod +x prefijos.sh

Fuente: Freesoftwareando

Script para descomprimir muchos archivos rar

Posted in Scripts, linux on February 6th, 2009 by mrcomputer – 7 Comments

Javier Parra me ha enviado un mail sugiriéndome que hiciese un script para descomprimir todos los archivos rar que se encuentren en la misma carpeta y con la misma contraseña.

Pues bien aquí está el script:

#!/bin/bash
 
#si los parametros por consola son menos que 2 mostramos la ayuda
if [ "$#" -lt "3" ]; then #si los parametros por consola son menos que 3 mostramos la ayuda
	echo "AYUDA"
	echo "$0 <ruta de los rar> <ruta de destino> <contraseña>  "
	echo
	echo "Ejemplo: $0 ./Descargas /home/mrcomputer/musica pass"
else
 
#Usamos un bucle for para ir recorriendo todos los archivos rar de la carpeta e ir descomprimiendolos
for archivos in $(ls $1/*.rar); do
	rar x -p$3 $archivos $2
done
 
fi

Solo teneis que guaradarlo con un archivo(por ejemplo rarp.sh) y darle permisos de ejecucion con chmod +x rarp.sh. Solo queda ejecutarlo con ./rarp.sh y os mostrara la ayuda para ver el orden de los parametro que hay que pasarle.

También he hecho la version para descomprimir archivos rar de una misma carpete pero esta vez si contraseña:

#!/bin/bash
 
#si los parametros por consola son menos que 2 mostramos la ayuda
if [ "$#" -lt "2" ]; then #si los parametros por consola son menos que 2 mostramos la ayuda
	echo "AYUDA"
	echo "$0 <ruta de los rar> <ruta de destino>"
	echo
	echo "Ejemplo: $0 ./Descargas /home/mrcomputer/musica"
else
 
#Usamos un bucle for para ir recorriendo todos los archivos rar de la carpeta e ir descomprimiendolos
for archivos in $(ls $1/*.rar); do
	rar x $archivos $2
done
 
fi

La instrucciones para ejecutarlo son las mismas.

En ambos scripts es necesario tener instalado el programa rar.

Script para obtener tu ip

Posted in Scripts, linux on December 10th, 2008 by mrcomputer – 9 Comments

Este pequeño script se encarga de decirte cual es tu ip de una manera rápida, que te puede ser útil también para ponerla en conky.

El script se aprovecha de un servicio web para obtener la ip y descarga la web generada, después extrae la ip del fichero (lo cual es fácil ya que la IP esta en rojo y extrae las letras rojas solo).

wget http://fadlan.com/ip.php -O datos_ip --quiet
cat datos_ip | grep "color='red'&gt;" | cut -c 42-60 | tr "&lt;" " " | tr "/" " " | \
tr "f" " " | tr "o" " " | tr "n" " " | tr "t" " "$
 
rm -rf datos_ip

Otra cosa, me gustaría que me dijeseis que os parece que ponga scripts de vez en cuando en el blog, si os parecen útiles o al menos curiosos.

Script de borrado seguro de ficheros

Posted in Scripts, Trucos, linux on December 4th, 2008 by mrcomputer – Be the first to comment

Leyendo el blog Security by Default me he encontrado este post que tiene un interesante script de perl. Este script sirve para borrar de manera segura ficheros, sobreescribiendo los datos tres veces antes de eliminarlo.

A continuación os dejo el código del script:

my $fichero = @ARGV[0];
 
if (!$fichero ){
 
	print "Uso: sdelete.pl file\n";
 
}
 
&amp;sdelete($fichero);
 
sub sdelete {
 
	my $filename = @_[0];
 
	my $bytes = -s $filename;
 
	open(FILE, '+&lt;', $filename);
	seek(FILE, 0, 0);
	print FILE "X" x $bytes;
	print FILE "Z" x $bytes;
	print FILE "H" x $bytes;
	close(FILE);
	unlink $filename;
 
}
 
#http://www.securitybydefault.com

Guarda este código en un fichero llamado sdelete.pl o descargalos directamente desde aquí. Una vez hecho lo ejecutamos de la siguiente manera:

perl sdelete.pl  archivo_a_borrar

Fuente

Script para descargar la revista Linux Magazine

Posted in Scripts, Trucos, linux on December 2nd, 2008 by mrcomputer – 10 Comments

Actualización 5-12-08: Después de estar investigando he conseguido que los artículos de la revista queden en orden. Además de alguna cosa que he añadido. Tambien he encontrado la fuente del script original

Como muchos de vosotros sabréis la revista Linux Magazine pone a disposición de todos para descargar los artículos de revistas con ya algunos meses de antigüedad, pero el problema que tiene es que debes de ir bajando artículo por artículo para tener la revista completa.
Hace un tiempo encontré un script que permitía descargar todo ejecutándolo, pero lo he mejorado y he hecho que también los una todos en un sólo PDF.

Aquí os dejo el script:

#!/bin/sh
#
# Modificado por mrcomputer  5-12-2008
#
#Nota: no todas las revistas estan completas aun
#Para añadir nueva revista solo tienes que añadir el numero correspondiente
#al bucle for
#
mkdir Revistas_Linux_Magazine
cd Revistas_Linux_Magazine
for x in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 \
 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
do
mkdir Linux_Magazine_$x
cd Linux_Magazine_$x
wget --recursive --no-parent http://www.linux-magazine.es/issue/$x/
 
DIRECTORIO=www.linux-magazine.es/issue/$x
ARCHIVOS=$(ls -tru1 $DIRECTORIO/*.pdf)
#elimina los \n
ARC=$(echo $ARCHIVOS |sed -e 's/\n//g')
 
gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=LM_$x.pdf $ARC
mv -f www.linux-magazine.es/issue/$x/LM_$x.pdf ../Linux_Magazine_$x/
 
# Eliminar publicidades...
rm -r www.linux-magazine.es
rm -r edusol.info
rm -r www.smartphoneshow.com
rm -r www.opensourceworldconference.com
rm -r max.adobe.com
cd ..
done

Si tenéis alguna mejora me lo podéis comentar.