Friday, January 26, 2007

Solaris recursive grep...

Update: il post è del 2007 e relativo almeno a Solaris 8. 
Se avete una versione di Solaris abbastanza recente invece:


/usr/sfw/bin/ggrep -R .... :)

Per tutti gli altri:



Scusate se lo metto qui cosi... ma mi ero veramente rotto il cazzo di non trovare un alternativa decente a:
find . -exec grep "cicciolina" '{}' \; -print
o a soluzioni varie scriptate e arrangiate al momento.

Se non vi piace me lo tengo per me :P


------------------------------------------CUT HERE-----------------------------
#!/usr/bin/bash
#
#
# Copyright (C) 2007 - Author: giobbe (http://self-view.blogspot.com)
# All rights reserved.
# THIS IS FREE SOFTWARE
# Released under GNU/GPL General Public License v2.0 http://www.gnu.org/copyleft/gpl.html

# Here you can choose to statically insert which directories you want to exclude from the search.
#EXCLUDE_DIRS="DIRECTORY3 temp DIRECTORY4 /usr/tmp"
EXCLUDE_DIRS=""



if [ "$1" == "" ];
then
echo
echo "Usage: $0 'text to find' [ 'directories to exclude' ]"
echo
echo " esempio:"
echo " $0 'foo' '/tmp /var/tmp directory3' "
echo " $0 'foo' "
echo
exit 1
fi


if [ "$2" != "" ]
then
EXCLUDE_DIRS="$EXCLUDE_DIRS $2"
echo $EXCLUDE_DIRS
fi






echo "Directory check..."
BASE_PATH=$PWD
EXCLUDE_DIRS2=""
for curr_dir in `echo $EXCLUDE_DIRS|tr -s "|" "\n"`
do
if [ -d $BASE_PATH/$curr_dir ]
then
# Aggiungo il percorso assoluto della directory se non c'e'
EXCLUDE_DIRS2=$EXCLUDE_DIRS2"|^"$BASE_PATH/$curr_dir
echo " - directory $BASE_PATH/$curr_dir valida."
else
if [ -d $curr_dir ]
then
# La directory contiene gia' il percorso assoluto
EXCLUDE_DIRS2=$EXCLUDE_DIRS2"|^"$curr_dir
echo " - directory $curr_dir valida."
else
echo " - directory $curr_dir non esistente"
fi
fi
done
EXCLUDE_DIRS=`echo $EXCLUDE_DIRS2|cut -c2-`


echo "--------------------"
echo " BEGIN SEARCH ... "
echo " "

if [ "$EXCLUDE_DIRS" != "" ]
then
echo "COMMMAND: find $PWD |egrep -vi \"$EXCLUDE_DIRS\""
CMD=`find $PWD |egrep -vi "$EXCLUDE_DIRS"`
else
echo "COMMMAND: find $PWD"
CMD=`find $PWD`
fi

TEXT="$1"

for i in $CMD
do

#SE IL FILE SI TROVA IN UNA DELLE DIRECTORY DI EXCLUDE_DIRS, VADO AVANTI
file $i | grep text 2>&1 > /dev/null
A=$?
if [ $A -eq 0 ]
then
grep -in $TEXT $i 2>&1 > /dev/null

if [ $? -eq 0 ]
then
echo "------------------ $i ------------------"
grep -in $TEXT $i
echo "-----------------------------------------"
fi
fi

done


---------------------------------CUT HERE-----------------------------


Eccolo qui in alto, dopo tanti anni... l'avro' scritto e riscritto almeno 1milione di volte senza mai salvarmelo da nessuna parte...
Ovviamente lo script ha funzionalita' di base dettate dalla necessita' del momento.... (in particolare ieri presso un cliente...)
Riassumendo:

- grep ricorsivo (recursive grep)
- possibilita' di specificare una o piu' directory da omettere nel percorso di ricerca (directories exclusion on recursive search)
- possibilita' di specificare su riga di comando il testo da cercare e le directories da escludere nella ricerca (primo e secondo argomento).

COSA NON FA (o FA', ma NON e' stato progettato PER)
- ricerca NON ricorsiva
- ricerca con wildcards, etc
- supporto OpenGL, masterizzatore DVD, controllo della televisione :)
- NON SUPPORTA I GIOCHI XBOX... (ahaha)
- altri 20milioni di funzionalita' che vi possono venire in mente
- testato sotto Solaris 10....
- NON MI ASSUMO RESPONSABILITA' PER DANNI A COSE O PERSONE
- THIS SOFTWARE COMES ABSOLUTELY AS IS... READ THE LICENSE
- TEMPO DI SVILUPPO: 30minuti... quindi NON CACATE IL CAZZO :)

2 comments:

Anonymous said...

provato su osx tiger, funziona cambiando l'interprete (/usr/bin/bash non esiste su osx, c'e' /bin/bash).

Volevo postare degli esempi ma...
Non è possibile accettare il codice PHP, ASP, and other server-side scripting is not allowed. specificato.
:)

Alessandro said...

su Debian sid e' ok pure,
bisogna trovare qualcuno che ce lo testa anche su aix, hp-ux e qualche altro sistema "strano" :)..

osx cmq il grep -r ce l'ha :)