]> git.llucax.com Git - personal/documentos.git/commitdiff
Se agregan varios scripts útiles.
authorLeandro Lucarella <llucax@gmail.com>
Mon, 28 Jul 2003 04:50:19 +0000 (04:50 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Mon, 28 Jul 2003 04:50:19 +0000 (04:50 +0000)
14 files changed:
bin/desempaquetar [new file with mode: 0755]
bin/empaquetar [new file with mode: 0755]
bin/empaquetar2 [new file with mode: 0755]
bin/firma [new file with mode: 0755]
bin/firma-off [new file with mode: 0755]
bin/grab.php [new file with mode: 0755]
bin/mail2abook.py [new file with mode: 0755]
bin/mount_camara [new file with mode: 0755]
bin/rotar-mensajes-enviados.sh [new file with mode: 0755]
bin/rotar-mensajes.sh [new file with mode: 0755]
bin/sqwebmail2mutt [new file with mode: 0755]
bin/svnaddkw [new file with mode: 0755]
bin/svnkw [new file with mode: 0755]
bin/tagline [new file with mode: 0755]

diff --git a/bin/desempaquetar b/bin/desempaquetar
new file mode 100755 (executable)
index 0000000..8ce97fb
--- /dev/null
@@ -0,0 +1,27 @@
+#!/bin/sh
+if [ "`echo "$1" | grep .zip`" ]; then
+    comando="unzip"
+else
+    if [ "`echo "$1" | grep .rar`" ]; then
+        comando="unrar x -p-"
+    else
+        if [ "`echo "$1" | grep .ace`" ]; then
+            comando="unace x -c-"
+        else
+            if [ "`echo "$1" | grep .tar.bz2`" ]; then
+               comando="tar -xvjf"
+            else
+                if [ "`echo "$1" | grep .tar.gz`" ]; then
+                   comando="tar -xvjf"
+                else
+                    comando="tar -xvf"
+                fi
+            fi
+        fi
+    fi
+fi
+dir=`dirname "$1"`
+filename=`basename "$1"`
+cd "$dir"
+$comando "$filename"
+cd "$OLDPWD"
diff --git a/bin/empaquetar b/bin/empaquetar
new file mode 100755 (executable)
index 0000000..2126b83
--- /dev/null
@@ -0,0 +1,6 @@
+#!/bin/sh
+dir=`dirname "$1"`
+file=`basename "$1"`
+cd $dir
+tar -cvzf $1.tar.gz "$file"
+cd $OLDPWD
diff --git a/bin/empaquetar2 b/bin/empaquetar2
new file mode 100755 (executable)
index 0000000..33eb6d8
--- /dev/null
@@ -0,0 +1,6 @@
+#!/bin/sh
+dir=`dirname $1`
+file=`basename "$1"`
+cd $dir
+tar -cvjf $1.tar.bz2 "$file"
+cd $OLDPWD
diff --git a/bin/firma b/bin/firma
new file mode 100755 (executable)
index 0000000..50d0e67
--- /dev/null
+++ b/bin/firma
@@ -0,0 +1,4 @@
+#!/bin/sh
+cat ~/.firma.base
+#tagline
+fortune -s
diff --git a/bin/firma-off b/bin/firma-off
new file mode 100755 (executable)
index 0000000..50ece48
--- /dev/null
@@ -0,0 +1,4 @@
+#!/bin/sh
+cat ~/.firma.base
+#tagline
+fortune -o
diff --git a/bin/grab.php b/bin/grab.php
new file mode 100755 (executable)
index 0000000..b0b4727
--- /dev/null
@@ -0,0 +1,47 @@
+#!/usr/bin/php4 -qC
+<?
+
+if ( $argc < 3 )
+    die( "faltan argumentos! $argv[0] URL EXP PREFIX\n" );
+
+$url    = $argv[1];
+$exp    = $argv[2];
+$prefix = $argv[3];
+
+preg_match( '|(https?://)?(.*/)([^/]+)?|i', $url, $m );
+$urlbasepath = ( empty( $m[1] ) ? 'http://' : $m[1] ) . ( empty( $m[2] ) ? '' : $m[2] );
+preg_match( '|https?://[^/]*|i', $urlbasepath, $m );
+$urlbase = $m[0];
+
+$file = join( '', file( $url, 'r' ) );
+
+if ( empty( $file ) )
+    die( "No se pudo abrir $url\n" );
+
+preg_match_all( '|href="?(([^"]*/)?([^"/]+))"?|i', $file, $m, PREG_SET_ORDER );
+
+foreach ( $m as $link ) {
+    list( $href, $url, $path, $file ) = $link;
+    if ( file_exists( "$prefix$file" ) and filesize( "$prefix$file" ) )
+        continue;
+    if ( preg_match( "|$exp|i", $url ) ) {
+        if ( preg_match( '|http://|i', $url ) )
+            $arch = $url;
+        elseif ( preg_match( '|^/|i', $url ) ) 
+            $arch = "$urlbase$path$file";
+        else
+            $arch = "$urlbasepath$path$file";
+        $fi = fopen( $arch, 'r' );
+        $fo = fopen( "$prefix$file", 'w' );
+        echo "Bajando $arch ";
+        while ( $fi and !feof( $fi ) ) {
+            fputs( $fo, fread( $fi, 4096 ) );
+            echo '.';
+        }
+        echo " listo!\n";
+        fclose( $fi );
+        fclose( $fo );
+    }
+}
+
+?>
diff --git a/bin/mail2abook.py b/bin/mail2abook.py
new file mode 100755 (executable)
index 0000000..cfb3af5
--- /dev/null
@@ -0,0 +1,436 @@
+#!/usr/bin/env python
+
+# NOTE: starting from abook version 0.4.15 it is often more convenient
+# to use command line option "--add-email" instead of this script
+
+# mail2abook.py version 0.1pre4
+# by Jaakko Heinonen <jheinonen@users.sourceforge.net>
+# based on Moritz Moeller-Herrmann's mail2muttalias.py
+
+# Description:
+# this script reads all mail adresses from a piped mailfile and
+# offers to write them to the ABOOKFILE specified in the script
+# Append the following lines or similiar to your muttrc:
+# macro pager A |'path to script'/mail2abook.py\n
+
+# Then press A in pager mode to add an address to your abook addressbook
+
+# Here's the original copyright information:
+
+# RELEASE 0.5
+##
+# Needs python 1.5 and cursesmodule 1.4 by andrich@fga.de (Oliver Andrich)   
+# available somewhere on http://www.python.org or directly from
+# http://andrich.net/python/selfmade.html
+#
+# Copyright by Moritz Moeller-Herrmann <mmh@gmnx.net>
+#
+# Homepage (check for changes before reporting a bug)
+# http://webrum.uni-mannheim.de/jura/moritz/mail2muttalias.html 
+#
+# Use this any way you want. Please inform me of any error/improvement
+# and leave the copyright notice untouched.
+# No warranties, as this is my first program :-)
+# Works for me on Linux with Python 1.5+
+# 
+# Thanks to Josh Hildebrand for some improvements
+##
+
+# Known bugs: 
+# If name containing @ is quoted("") before a mail adress, 
+# the program will not catch the whole name, 
+# but who would alias such an idiot?
+# If you get a problem with "unknown variable / keyword error" 
+# with KEYUP and KEYDOWN, either get a newer pythoncurses module 
+# or change them to lowercase.
+#
+# Probably some more, mail me if you find one!
+
+import re 
+import string, sys, os 
+import curses, traceback
+
+
+ABOOKFILE=os.environ["HOME"] + "/.abook.addressbook"
+
+try :
+       testcurses = curses.KEY_UP
+except NameError:
+       print "Your pythoncurses module is old. Please upgrade to 1.4 or higher."
+       print "Alternative: Modify the script. Change all 6 occurences of curses.KEY_UP"
+       print "and similiar to lowercase."
+
+try : testAF = ABOOKFILE #test if ALIASFILE was configured in script
+except NameError:
+       try: ALIASFILE=os.environ["ABOOKFILE"] #test is environment MUTTALIASFILE was set
+       except KeyError:
+               print "Please specify ABOOKFILE at beginning of script \nor set environment variable ABOOKFILE"
+               print "Aborting ..."
+               sys.exit()
+
+
+
+###Thanks for the following go to Michael P. Reilly
+if not sys.stdin.isatty():  # is it not attached to a terminal?
+  file = sys.stdin.read()
+  sys.stdin = _dev_tty = open('/dev/tty', 'w+')
+  # close the file descriptor for stdin thru the posix module
+  os.close(0)
+  # now we duplicate the opened _dev_tty file at file descriptor 0 (fd0)
+  # really, dup creates the duplicate at the lowest numbered, closed file
+  # descriptor, but since we just closed fd0, we know we will dup to fd0
+  os.dup(_dev_tty.fileno())  # on UNIX, the fileno() method returns the
+                             # file object's file descriptor
+else:  # is a terminal
+       print "Please use as a pipe!"
+       print "Aborting..."
+       sys.exit()
+# now standard input points to the terminal again, at the C level, not just
+# at the Python level.
+
+
+print "Looking for mail adresses, this may take a while..."
+
+
+####  define functions
+
+
+class screenC:
+       "Class to create a simple to use menu using curses"
+       def __init__(self):
+               import curses, traceback
+               self.MAXSECT = 0
+               self.LSECT = 1
+               # Initialize curses
+               self.stdscr=curses.initscr()
+               # Turn off echoing of keys, and enter cbreak mode,
+               # where no buffering is performed on keyboard input
+               curses.noecho() 
+               curses.cbreak()
+
+               # In keypad mode, escape sequences for special keys
+               # (like the cursor keys) will be interpreted and
+               # a special value like curses.KEY_LEFT will be returned
+               self.stdscr.keypad(1)           
+       
+       def titel(self,TITEL="Title  - test",HELP="Use up and down arrows + Return"):   
+               "Draws Title and Instructions"
+               self.stdscr.addstr(0,0,TITEL,curses.A_UNDERLINE)                                # Title + Help
+               self.stdscr.addstr(self.Y -2 ,0,HELP,curses.A_REVERSE)
+
+       def refresh(self):
+               self.stdscr.refresh()
+
+       def size(self):
+               "Returns screen size and cursor position"
+               #Y, X = 0, 0
+               self.Y, self.X = self.stdscr.getmaxyx()
+               #self.y, self.x = 0, 0
+               self.y, self.x = self.stdscr.getyx()
+               #print Y, X
+               return self.Y, self.X, self.y, self.x
+               
+
+       def showlist(self,LISTE,LSECT=1):
+               "Analyzes list, calculates screen, draws current part of list on screen "
+               s = self.Y -3                                                           #space on screen
+               self.MAXSECT=1
+               while len(LISTE) > self.MAXSECT * s :           # how many times do we need the screen?
+                       self.MAXSECT = self.MAXSECT +1
+                       
+               if self.LSECT > self.MAXSECT:                           #check for end of list
+                       self.LSECT = LSECT -1
+               
+               if self.LSECT <=        0:                                              # 
+                       self.LSECT =1           
+               
+               if len(LISTE) <= s:
+                       self.LISTPART=LISTE
+               
+               else :
+                       self.LISTPART=LISTE[s * ( self.LSECT -1 ) : s * self.LSECT ]    # part of the List is shown
+               
+               self.stdscr.addstr(self.Y -2, self.X -len(`self.LSECT`+`self.MAXSECT`) -5, "(" + `self.LSECT` + "/" + `self.MAXSECT` + ")")
+               #if len(LISTE) > self.Y - 3:
+               #       return 1
+               for i in range (1, self.Y -2):                  # clear screen between title and help text
+                       self.stdscr.move(i , 0)
+                       self.stdscr.clrtoeol()
+               for i in range (0,len(self.LISTPART)):          # print out current part of list
+                       Item = self.LISTPART[i]
+                       self.stdscr.addstr(i +1, 0, Item[:self.X])
+       
+       def getresult(self,HOEHE):
+               "Get Result from cursor position"
+               RESULT= self.LISTPART[(HOEHE -1)]
+               return RESULT
+       
+       def showresult(self, HOEHE, DICT={}):
+               "Look up result to show in dictionary if provided, return list member otherwise"
+               if DICT=={}:
+                       return self.getresult(HOEHE)
+               else :
+                       return string.join(DICT[self.getresult(HOEHE)], " || ")
+               
+
+       
+       def menucall(self, LISTE, DICT={}, TITEL="",HELP="Use up and down arrows, Return to select"):
+               "Takes a list and offers a menu where you can choose one item, optionally, look up result in dictionary if provided"
+               REFY=1
+               self.__init__()
+               self.size()
+               self.titel(TITEL,HELP)
+               self.showlist(LISTE)
+               self.refresh()
+               self.stdscr.move(1,0)
+               while 1:                                                                        # read Key events 
+                       c = self.stdscr.getch()
+                       self.size()
+                       
+                       #if c == curses.KEY_LEFT and self.x  > 0:
+                       #       self.stdscr.move(self.y, self.x -1); REFY = 1 # REFY == refresh: yes
+                       
+                       #if c == curses.KEY_RIGHT               and self.x < self.X -1:
+                       #       #if x < 4 and LENGTH - ZAHLY > y - 1: 
+                       #       self.stdscr.move(self.y, self.x + 1); REFY = 1
+                       
+                       if c == curses.KEY_UP or c == 107: #up arrow or k
+                               if self.y > 1:
+                                       self.stdscr.move(self.y -1, self.x); REFY = 1
+                               else :
+                                       self.LSECT=self.LSECT-1
+                                       self.showlist(LISTE,self.LSECT)
+                                       self.stdscr.move(len(self.LISTPART), 0)
+                                       REFY = 1
+                               
+                       if c == curses.KEY_DOWN or c == 106: #down arrow or j
+                               
+                               if self.y < len(self.LISTPART) :        
+                                       self.stdscr.move(self.y +1, self.x); REFY = 1
+
+                               else :
+                                       self.LSECT=self.LSECT+1
+                                       self.showlist(LISTE,self.LSECT)
+                                       self.stdscr.move(1,0)
+                                       REFY = 1
+                       
+                       if c == curses.KEY_PPAGE:
+                               self.LSECT=self.LSECT-1
+                               self.showlist(LISTE,self.LSECT)
+                               self.stdscr.move(1, 0)
+                               REFY = 1
+
+                       if c == curses.KEY_NPAGE:
+                               self.LSECT=self.LSECT+1
+                               self.showlist(LISTE,self.LSECT)
+                               self.stdscr.move(1,0)
+                               REFY = 1
+
+                       if c == curses.KEY_END:
+                               self.LSECT=self.MAXSECT
+                               self.showlist(LISTE,self.LSECT)
+                               self.stdscr.move(1,0)
+                               REFY = 1
+                       
+                       if c == curses.KEY_HOME:
+                               self.LSECT=1
+                               self.showlist(LISTE,self.LSECT)
+                               self.stdscr.move(1,0)
+                               REFY = 1
+
+
+                       if c == 10 :                            # \n (new line)
+                               ERG = self.getresult(self.y )
+                               self.end()
+                               return ERG
+                       
+                       if c == 113 or c == 81:                 # "q or Q"
+                               self.printoutnwait("Aborted by user!")
+                               self.end()
+                               sys.exit()
+                               return 0
+                               
+                       if REFY == 1:
+                               REFY = 0
+                               self.size()
+                               self.stdscr.move(self.Y -1, 0)
+                               self.stdscr.clrtoeol()
+                               self.stdscr.addstr(self.Y -1, 0, self.showresult(self.y,DICT)[:self.X -1 ], curses.A_BOLD)
+                               self.stdscr.move(self.y, self.x)
+                               self.refresh()
+
+       def end(self):
+               "Return terminal"
+               # In the event of an error, restore the terminal
+               # to a sane state.
+               self.Y, self.X, self.y, self.x = 0, 0, 0, 0
+               self.LISTPART=[]
+               self.stdscr.keypad(0)
+               curses.echo()
+               curses.nocbreak()
+               curses.endwin()
+               #traceback.print_exc()
+
+       def input(self, promptstr):
+               "raw_input equivalent in curses, asks for  Input and returns it"
+               self.size()
+               curses.echo()
+               self.stdscr.move(0,0)
+               self.stdscr.clear()
+               self.stdscr.addstr(promptstr)
+               self.refresh()
+               INPUT=self.stdscr.getstr()
+               curses.noecho()
+               return INPUT
+       
+                                       
+       def printoutnwait(self, promptstr):
+               "Print out Text, wait for key"
+               curses.noecho()
+               self.stdscr.move(0,0)
+               self.stdscr.clear()
+# The new Mutt client pauses after running the script already.  No reason
+# to pause twice.  -Josh
+#              self.stdscr.addstr(promptstr+"\n\n(press key)")
+#              self.refresh()
+#              c = self.stdscr.getch()# read Key events 
+               
+
+
+def listrex (str, rgx): # Return a list of all regexes matched in string
+       "Search string for all occurences of regex and return a list of them."
+       result = []
+       start = 0 # set counter to zero
+       ende =len (str) #set end position
+       suchadress = re.compile(rgx,re.LOCALE)#compile regular expression, with LOCALE
+       while 1:
+               einzelerg = suchadress.search(str, start,ende) #create Match Object einzelerg
+               if einzelerg == None:#until none is found
+                       break
+               result.append(einzelerg.group()) #add to result
+               start = einzelerg.end()
+       return result
+
+def strrex (str): # Return first occurence of regular exp  as string
+       "Search string for first occurence of regular expression and return it"
+       muster = re.compile(r"<?[\w\b.ßüöä-]+\@[\w.-]+>?", re.LOCALE)   #compile re
+       matobj = muster.search(str)             #get Match Objekt from string 
+       if muster.search(str) == None:          #if none found
+               return ""
+       return matobj.group()                   #return string 
+
+def stripempty (str):#Looks for all empty charcters and replaces them with a space
+       "Looks for all empty charcters and replaces them with a space,kills trailing"
+       p = re.compile( "\s+")          #shorten
+       shrt = p.sub(" ", str)
+       q = re.compile("^\s+|\s+$")     #strip
+       strp = q.sub("", shrt)
+       return strp
+
+def getmailadressfromstring(str):
+       "Takes str and gets the first word containing @ == mail adress"
+       StringSplit=string.split(str)
+       for i in range(len(StringSplit)):
+               if "@" in StringSplit[i]:
+                       return StringSplit[i]
+       return None
+
+### main program
+
+OCCLIST = listrex(file, '"?[\s\w\ö\ä\ü\-\ß\_.]*"?\s*<?[\w.-]+\@[\w.-]+>?')#get list, RE gets all Email adresses + prepending words
+
+if OCCLIST:
+       print len(OCCLIST),"possible adresses found!." 
+else: 
+       print"ERROR, no mails found"
+       sys.exit()
+
+
+for i in range(len(OCCLIST)):                  #strip all whitespaces + trailing from each list member
+       OCCLIST[i] = string.strip(OCCLIST [i])
+
+
+OCCDIC={}                                              # Dictionary created to avoid duplicates
+for i in range(len(OCCLIST)):                  # iterate over 
+       d = OCCLIST[i]
+       Mail = getmailadressfromstring(OCCLIST[i])
+                       #strrex(OCCLIST[i])                     #Mailadresse
+       Schnitt = - len(Mail)                           #cut off mail adress
+       Mail = string.replace(Mail, "<", "")#remove <>
+       Mail = string.replace(Mail, ">", "")
+       Name = string.replace (stripempty (d[:Schnitt]), '"', '')               #leaves name
+       if not OCCDIC.get(Mail):                        # if new Emailadress
+               Liste = []                                              # create list for names
+               Liste.append(Name)                              # append name 
+               OCCDIC[Mail] = Liste                    # assign list to adress
+       else :  
+               Liste = OCCDIC[Mail]                    # otherwise get list
+               Liste.append(Name)                              # append name to list of names
+               OCCDIC[Mail] =  Liste                   # and assign
+
+
+KEYS = OCCDIC.keys()                           #iterate over dictionary, sort names 
+                                                                       #KEYS are all the adresses
+
+for z in range( len(KEYS) ): 
+       NAMLIST = OCCDIC[KEYS[z]]               # Get list of possible names
+       d = {}                                                  # sort out duplicates and 
+                                                                       # remove bad names + empty strings from adresses
+       for x in NAMLIST: 
+               if x in ["", "<"]: continue
+               d[x]=x
+       NAMLIST = d.values()
+       NAMLIST.sort()                                  # sort namelist alphabetically
+       print z, KEYS[z], "had possible names:", NAMLIST # Debugging output
+       OCCDIC[KEYS[z]] = NAMLIST               # 
+
+print "\n"
+
+###sorting
+
+def Comparelength(x, y):
+       "Compare number of names in OCCDIC, if equal sort alphabetically."
+       if len(OCCDIC[y]) == len(OCCDIC[x]):
+               return cmp(x, y)
+       if len(OCCDIC[y]) < len(OCCDIC[x]):
+               return -1
+       else:
+               return 1        
+
+KEYS.sort(Comparelength)                                       # Keys sort
+
+###menu
+
+ScreenObject=screenC()                 # initialize curses menu
+try:
+       ZIELADRESS = ScreenObject.menucall(KEYS, OCCDIC, "Choose adress to alias")
+       if OCCDIC[ZIELADRESS]:
+               LISTNAM=["***ENTER own NAME"]           #add option to edit name
+               LISTNAM= LISTNAM + OCCDIC[ZIELADRESS]
+               ZIELNAME   = ScreenObject.menucall(LISTNAM, {}, ZIELADRESS + " has which of the possible names?")
+               # empty Dictionary {} means show list member itself, not looked up result
+       else : ZIELNAME=""
+except:
+       T=ScreenObject.size()
+       ScreenObject.end()
+#      traceback.print_exc() # Uncomment for curses debugging info
+#      print T
+       sys.exit()
+
+### enter new names/aliases
+
+if  ZIELNAME == "***ENTER own NAME" or ZIELNAME == "":
+       ZIELNAME = ScreenObject.input(`ZIELADRESS` + " = " + `OCCDIC[ZIELADRESS]` + "\n" + `ZIELADRESS` + " gets which name? ")
+
+if ZIELNAME == "":
+       ZIELNAME = "No name"
+
+WRITEALIAS = "\n[]\nname=" + ZIELNAME + "\nemail=" + ZIELADRESS + "\n\n"
+
+f = open(ABOOKFILE, "a")
+f.write(WRITEALIAS)
+f.close()
+
+ScreenObject.printoutnwait("Item was added to "+  ABOOKFILE + "\nProgam terminated")
+ScreenObject.end()
+
diff --git a/bin/mount_camara b/bin/mount_camara
new file mode 100755 (executable)
index 0000000..48416cb
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+/bin/ls /dev/scsi/host1/bus0/target0/lun0/ >> /dev/null
+/bin/mount /camara
diff --git a/bin/rotar-mensajes-enviados.sh b/bin/rotar-mensajes-enviados.sh
new file mode 100755 (executable)
index 0000000..8d5921f
--- /dev/null
@@ -0,0 +1,18 @@
+#!/bin/sh
+PATH=/usr/local/bin:/usr/bin:/bin
+HOME=/home/luca
+
+anio=`date +%Y`
+mes=`date +%m`
+mes=$((mes-1))
+if [ $mes -eq 0 ]; then
+    anio=$((anio-1))
+    mes=12
+fi
+mes=`printf "%02d" $mes`
+
+mv ~/Maildir/.Sent ~/Maildir/.Sent.$anio.$mes
+maildirmake.courier ~/Maildir/.Sent
+
+#echo mv ~/Maildir/.Linux.LUGMenSent ~/Maildir/.Sent.$anio.$mes
+#mv ~/Maildir/.Sent ~/Maildir/.Sent.`date +%Y`.`perl -e 'printf "%02d", \`date +%m\`-1'`
diff --git a/bin/rotar-mensajes.sh b/bin/rotar-mensajes.sh
new file mode 100755 (executable)
index 0000000..2e593e7
--- /dev/null
@@ -0,0 +1,39 @@
+#!/bin/sh
+# vim: set expandtab tabstop=4 shiftwidth=4 fdm=marker:
+# Versión 0.3
+#
+# ChangeLog:
+# v0.3:
+#       * Se limpia un poco el código.
+# v0.2:
+#       * Se agrega un filtro para que no se procesen los directorios con
+#         el postfijo para que no se arme el quilombo recursivo que se
+#         armaba :)
+# v0.1:
+#       * Versión inicial.
+#
+
+# Configuración {{{
+mantener=100
+ignorar_postfijo=.historial
+base=~/Maildir
+# }}}
+
+# Código {{{
+cd $base
+for maildir in `ls -d .* | egrep -v '^\.\.?/' | grep -v $ignorar_postfijo`; do
+    if [ -d "$maildir/cur" ]; then
+        mails=`ls "$maildir/cur" | wc -l`
+        if [ $mails -gt $mantener ]; then
+            tail=$((mails-mantener))
+            cd "$maildir/cur"
+            if [ ! -d "../../$maildir$ignorar_postfijo/cur" ]; then
+                maildirmake "../../$maildir$ignorar_postfijo"
+            fi
+            mv `ls | sort -r | tail -n$tail` "../../$maildir$ignorar_postfijo/cur"
+            cd "../.."
+        fi
+    fi
+done
+# }}}
+
diff --git a/bin/sqwebmail2mutt b/bin/sqwebmail2mutt
new file mode 100755 (executable)
index 0000000..b921d31
--- /dev/null
@@ -0,0 +1,18 @@
+#!/usr/bin/php4 -qC
+<?
+// Convertidor de mailboxes de sqwebmail (hidden) a mutt (via muttrc).
+
+array_shift( $argv );
+foreach ( $argv as $dir )
+    if ( is_dir( $dir ) ) {
+        echo "# Maildirs en los cuales chequeo los mails.\n";
+        echo "mailboxes ! \\\n";
+        $d = dir( $dir );
+        while ( ( $f = $d->read() ) !== false )
+            if ( is_dir("$dir/$f") and preg_match('/^\.[^\.]/', $f) and !strpos($f, 'historial') and !strpos($f, 'Spam') )
+                $dirs[] = "          \"=$f\"";
+        sort( $dirs );
+        echo join( " \\\n", $dirs);
+    }
+
+?>
diff --git a/bin/svnaddkw b/bin/svnaddkw
new file mode 100755 (executable)
index 0000000..83bede9
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+svn add "$@"
+svn ps svn:keywords "URL Rev Date Author Id" "$@"
diff --git a/bin/svnkw b/bin/svnkw
new file mode 100755 (executable)
index 0000000..7bdebd1
--- /dev/null
+++ b/bin/svnkw
@@ -0,0 +1,2 @@
+#!/bin/sh
+svn ps svn:keywords "URL Rev Date Author Id" "$@"
diff --git a/bin/tagline b/bin/tagline
new file mode 100755 (executable)
index 0000000..b895603
--- /dev/null
@@ -0,0 +1,26 @@
+#!/usr/bin/env python
+
+import sys, os, random
+
+if len( sys.argv ) > 1:
+    file = sys.argv[1]
+else:
+    file = os.getenv( 'HOME' ) + '/.taglines';
+
+f = open( file, 'r' )
+
+taglines = []
+tagline  = f.readline()
+while tagline:
+    buff = f.readline()
+    while (buff != "") and (buff != "\n"):
+        tagline += buff
+        buff     = f.readline()
+    taglines.append( tagline )
+    tagline = f.readline()
+
+f.close
+
+i = random.randrange( 0, len( taglines ) - 1 )
+
+print taglines[i][:-1]